spring boot slf4j日记记录配置详解

来源:互联网 发布:lego ev3编程软件下载 编辑:程序博客网 时间:2024/06/17 16:09

Spring-Boot--日志操作【全局异常捕获消息处理☞日志控制台输出+日志文件记录】

      最好的演示说明,不是上来就贴配置文件和代码,而是,先来一波配置文件的注释,再来一波代码的测试过程,最后再出个技术在项目中的应用效果,这样的循序渐进的方式,才会让读者更加清楚的理解一项技术是如何运用在项目中的,虽然本篇很简单,几乎不用手写什么代码,但是,比起网上其他人写的同类型的文章来说,我只能说,我很认真,认真的有点帅,哈哈哈哈。




一、日志记录相关依赖,首选Spring-Boot"原生态"的logback


Logback是由 log4j创始人设计的又一个开源日志组件


logback当前分成三个模块:


logback-core

logback- classic

logback-access


logback-core是其它两个模块的基础模块


如果在你的pom.xml中,依赖了如下内容




恭喜你,本篇你可以不用再添加日志组件的依赖了,为什么呢,我们看下spring-boot-starter-web的依赖树





二、当前Spring-Boot项目的目录结构


说明:如果只是为了贴代码,而不结合项目演示的话,我写本篇的初衷也就没什么意义了





三、本篇重点,logback-boot.xml内容解说

(1)主要看注释

[html] view plain copy
  1. <configuration>      
  2.     <!-- %m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名,%i索引【从数字0开始递增】,,, -->      
  3.     <!-- appender是configuration的子节点,是负责写日志的组件。 -->  
  4.     <!-- ConsoleAppender:把日志输出到控制台 -->  
  5.     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">      
  6.         <encoder>      
  7.             <pattern>%d %p (%file:%line\)- %m%n</pattern>    
  8.             <!-- 控制台也要使用UTF-8,不要使用GBK,否则会中文乱码 -->  
  9.             <charset>UTF-8</charset>     
  10.         </encoder>      
  11.     </appender>      
  12.     <!-- RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->  
  13.     <!-- 以下的大概意思是:1.先按日期存日志,日期变了,将前一天的日志文件名重命名为XXX%日期%索引,新的日志仍然是sys.log -->  
  14.     <!--             2.如果日期没有发生变化,但是当前日志的文件大小超过1KB时,对当前日志进行分割 重命名-->  
  15.     <appender name="syslog"      
  16.         class="ch.qos.logback.core.rolling.RollingFileAppender">      
  17.         <File>log/sys.log</File>      
  18.         <!-- rollingPolicy:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。 -->  
  19.         <!-- TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动 -->  
  20.         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">      
  21.             <!-- 活动文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 -->  
  22.             <!-- 文件名:log/sys.2017-12-05.0.log -->  
  23.             <fileNamePattern>log/sys.%d.%i.log</fileNamePattern>   
  24.             <!-- 每产生一个日志文件,该日志文件的保存期限为30天 -->   
  25.             <maxHistory>30</maxHistory>     
  26.             <timeBasedFileNamingAndTriggeringPolicy  class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">      
  27.                 <!-- maxFileSize:这是活动文件的大小,默认值是10MB,本篇设置为1KB,只是为了演示 -->    
  28.                 <maxFileSize>1KB</maxFileSize>      
  29.             </timeBasedFileNamingAndTriggeringPolicy>      
  30.         </rollingPolicy>      
  31.         <encoder>      
  32.             <!-- pattern节点,用来设置日志的输入格式 -->  
  33.             <pattern>      
  34.                 %d %p (%file:%line\)- %m%n    
  35.             </pattern>      
  36.             <!-- 记录日志的编码 -->  
  37.             <charset>UTF-8</charset> <!-- 此处设置字符集 -->     
  38.         </encoder>      
  39.     </appender>      
  40.     <!-- 控制台输出日志级别 -->  
  41.     <root level="info">      
  42.         <appender-ref ref="STDOUT" />      
  43.     </root>      
  44.     <!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 -->  
  45.     <!-- com.appley为根包,也就是只要是发生在这个根包下面的所有日志操作行为的权限都是DEBUG -->  
  46.     <!-- 级别依次为【从高到低】:FATAL > ERROR > WARN > INFO > DEBUG > TRACE  -->  
  47.     <logger name="com.appleyk" level="DEBUG">      
  48.         <appender-ref ref="syslog" />      
  49.     </logger>      
  50. </configuration>    



(2)application.properties中初始化logback-boot.xml




[plain] view plain copy
  1. #在application.properties文件中引入日志配置文件  
  2. #=====================================  log  =============================  
  3. logging.config=classpath:logback-boot.xml  





logback日志的配置我们已经弄完了,接下来就是演示了



四、定义全局异常捕获类【含异常消息的日志辅助记录】


主要看内容,内容看懂了,就知道logback日志记录在什么时候发挥作用了


(1)GlobalExceptionHandler.java


[java] view plain copy
  1. package com.appleyk.exception;  
  2.   
  3. import javax.servlet.http.HttpServletRequest;  
  4. import javax.servlet.http.HttpServletResponse;  
  5.   
  6. import org.slf4j.Logger;  
  7. import org.slf4j.LoggerFactory;  
  8. import org.springframework.web.bind.MissingServletRequestParameterException;  
  9. import org.springframework.web.bind.annotation.CrossOrigin;  
  10. import org.springframework.web.bind.annotation.ExceptionHandler;  
  11. import org.springframework.web.bind.annotation.RestControllerAdvice;  
  12.   
  13. import com.appleyk.result.ResponseResult;  
  14.   
  15. @CrossOrigin  
  16. @RestControllerAdvice  
  17. public class GlobalExceptionHandler {  
  18.   
  19.      private static Logger LOGGER = LoggerFactory.getLogger(GlobalExceptionHandler.class);  
  20.       
  21.     @ExceptionHandler  
  22.     public ResponseResult processException(Exception ex, HttpServletRequest request, HttpServletResponse response){  
  23.         ex.printStackTrace();  
  24.           
  25.         if(ex instanceof MissingServletRequestParameterException){  
  26.             return new ResponseResult(400, ex);  
  27.         }  
  28.         if(ex instanceof NoPermissions){  
  29.                   
  30.             LOGGER.error("======="+ex.getMessage()+"=======");  
  31.             return new ResponseResult(401"sorry,无权限!");  
  32.               
  33.         }  
  34.           
  35.         return new ResponseResult(500, ex.getMessage());  
  36.           
  37.     }  
  38.   
  39. }  

(2)注意





(3)我们看下这个自定义异常类NoPermissions长什么样




(4)NoPermissions这个异常我们在哪里抛出呢?


本篇,日志功能的测试是放在Controller中进行的,因此,这个自定义异常,也是放在Controller中抛出By手动




五、创建测试Controller


(1)LogTestController.java


[java] view plain copy
  1. package com.appleyk.controller;  
  2.   
  3. import org.slf4j.Logger;  
  4. import org.slf4j.LoggerFactory;  
  5. import org.springframework.web.bind.annotation.RequestMapping;  
  6. import org.springframework.web.bind.annotation.RequestParam;  
  7. import org.springframework.web.bind.annotation.RestController;  
  8.   
  9. import com.appleyk.exception.NoPermissions;  
  10. import com.appleyk.result.ExceptionEnum;  
  11. import com.appleyk.result.ResponseMessage;  
  12. import com.appleyk.result.ResponseResult;  
  13.   
  14. @RestController  
  15. public class LogTestController {  
  16.   
  17.     protected static Logger logger=LoggerFactory.getLogger(HelloController.class);    
  18.     @RequestMapping("/test")  
  19.     public ResponseResult Test(@RequestParam(value="role") Integer role) throws Exception{  
  20.           
  21.         logger.info("访问Controller");  
  22.         int i = role;  
  23.           
  24.         if(i<0){  
  25.             throw new NoPermissions(ExceptionEnum.WRONG_PERMISSONS.toString());  
  26.               
  27.         }  
  28.         else{  
  29.            return new ResponseResult(ResponseMessage.OK);  
  30.         }  
  31.           
  32.           
  33.     }  
  34.       
  35. }  



(2)注意




(3)我们来看一下自定义异常枚举里面的消息






六、测试Controller,测试日志记录功能


(1)测试前




(2)再看一下,logback-boot.xml中,配置的日志输出路径是什么




(3)启动Spring-boot项目





(4)浏览器中测试


A. 先测试成功的: http://localhost:8080/test?role=100


1.浏览器返回数据json解析效果



2.控制台日志info级别的输出




3.文件日志info级别的写入




4.由于日志文件的大小在logback-boot.xml中配置了超过1KB就产生新的日志文件,命名规则见配置文件,因此


多次刷新浏览器,我们会发现如下:【注意,得多刷几十次,才能出来效果,因为1KB的内容还是不少的】





5:注意


A.控制台日志输出级别:INFO




B.日志记录到文件级别:DEBUG







(5)Insomnia专业API测试工具测试


B. 再测试异常的: http://localhost:8080/test?role=-1


1.为了演示最佳效果,先停掉当前项目,再清空log文件夹下面的所有日志




2.启动项目


日志记录文件立竿见影【牢记日志记录文件的级别是DEBUG】





3.测试API【显然role=-1的时候,对应的Controller抛出自定义异常】




4.观察下日志




按照级别,大于DEBUG的都会出现在日志记录文件里,所以,我们的ERROR出现了





5.多Send一下,观察日志文件变化




这个是今天的日志,假设我改下系统日期操作如下


6.本篇的创作时间是2017年12月5日13:37:35【周二】,改为2017年12月6日13:37:49【周三】




然后我们在多Send几次观察下日志文件的变化






演示完,记得把系统日期改过来

文章转载至:http://blog.csdn.net/appleyk/article/details/78717388
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 三洋智能洁身器 京东洁身器 洗之朗洁身器维修 荣事达智能洁身器价格 荣事达洁身器怎么样 洁身 马桶有几种 马桶有哪几种 马桶款式 马桶样式 洁身自好 洁身自爱全文阅读 边玉洁男儿身照片 洁身自好的意思 华道夫 安道夫 洁面膏是洗面奶吗 洁面乳洗面奶 洁面乳和洗面奶区别 150g洁面乳能上飞机吗 洁面乳使用方法 洗面奶洁面乳 男士洁面乳排行榜 学生应该用洁面乳还是洗面奶 洗面奶和洁面乳 男士洁面乳 洁面乳哪家好 洗面奶和洁面乳哪个好 pola洁面乳 祛斑洁面乳 什么牌子洁面乳好 曼秀雷敦洁面乳多少钱 洁面乳是洗面奶吗 洁面乳是洗脸的吗 洁肤乳是洗面奶吗 洁颜乳是洗面奶吗 洗面奶和洁面乳的区别 面乳怎么用 洁面啫喱和洁面乳的区别 温和洁面乳 比较温和的洁面乳