SpringBoot会默认使用logback作为日志框架,在生成springboot项目的时候可以直接勾选logback,那么就可以直接使用logback了,这样就会省去了导入依赖的步骤可以直接使用Logback了。
项目中日志实例的获取
在代码中有两种获取log实例的方法
- 注解方式
通过依赖lombok包,使用@Slf4j注解,直接使用log实例。- LoggerFactory方式
LoggerFactory.getLogger(Class> clazz); 获取实例然后就可以在我们需要的地方调用方法了
## 配置logback-spring.xml ##
> 这时候有了调用。就需要配置我们日志的xml文件了
> xml文件位置放置在resources文件下和springboot的application文件同级。
> 因为springboot推荐的文件的格式是logback-spring.xml,可以解决多环境下一些变量名在application文件中。但是日志文件读取不到的问题,所以我们把文件名字设置成logback-spring.xml以下是我自己使用的logback-spring.xml文件
“`
<!-- 动态日志级别 -->
<jmxConfigurator/>
<!-- 定义日志文件 输出位置 -->
<property name="log.log_dir" value="logs"/>
<property name="log.log_name" value="log"/>
<!-- 日志最大的历史 30天 -->
<property name="log.maxHistory" value="30"/>
<property name="log.level" value="debug"/>
<property name="log.maxSize" value="5MB" />
<!-- ConsoleAppender 控制台输出日志 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>
<!-- 设置日志输出格式 -->
<!-- 日期 [线程] [class类]-[日志级别] log内容 -->
%blue(%d{yyyy-MM-dd HH:mm:ss,SSS}) [%cyan(%t)] [%yellow(%c)]-[%highlight(%p)] %m%n
</pattern>
</encoder>
</appender>
<!-- ERROR级别日志 -->
<!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 RollingFileAppender -->
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 过滤器,只记录WARN级别的日志 -->
<!-- 果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 设置过滤级别 -->
<level>ERROR</level>
<!-- 用于配置符合过滤条件的操作 -->
<onMatch>ACCEPT</onMatch>
<!-- 用于配置不符合过滤条件的操作 -->
<onMismatch>DENY</onMismatch>
</filter>
<!-- 最常用的滚动策略,它根据时间来制定滚动策略.既负责滚动也负责触发滚动 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志输出位置 可相对、和绝对路径 -->
<fileNamePattern>
${log.log_dir}/error/%d{yyyy-MM-dd}/error_${log.log_name}-%i.log
</fileNamePattern>
<!-- 可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件,假设设置每个月滚动,且<maxHistory>是6,
则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除 -->
<maxHistory>${log.maxHistory}</maxHistory>
<!--日志文件最大的大小-->
<MaxFileSize>${log.maxSize}</MaxFileSize>
</rollingPolicy>
<encoder>
<pattern>
<!-- 设置日志输出格式 -->
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</encoder>
</appender>
<!-- INFO级别日志 appender -->
<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.log_dir}/info/%d{yyyy-MM-dd}/info_${log.log_name}-%i.log</fileNamePattern>
<maxHistory>${log.maxHistory}</maxHistory>
<MaxFileSize>${log.maxSize}</MaxFileSize>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger - %msg%n</pattern>
</encoder>
</appender>
<!-- DEBUG级别日志 appender -->
<appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.log_dir}/debug/%d{yyyy-MM-dd}/debug_${log.log_name}-%i.log</fileNamePattern>
<maxHistory>${log.maxHistory}</maxHistory>
<MaxFileSize>${log.maxSize}</MaxFileSize>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger - %msg%n</pattern>
</encoder>
</appender>
<!--设置一个向上传递的appender,所有级别的日志都会输出-->
<appender name="app" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.log_dir}/app/%d{yyyy-MM-dd}/app_${log.log_name}-%i.log</fileNamePattern>
<maxHistory>${log.maxHistory}</maxHistory>
<MaxFileSize>${log.maxSize}</MaxFileSize>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger - %msg%n</pattern>
</encoder>
</appender>
<!--name包下的类的日志输出-->
<logger name="com.example.webtest.controller" additivity="true" level="DEBUG" >
<appender-ref ref="ERROR" />
<appender-ref ref="INFO" />
</logger>
<!-- root级别 DEBUG -->
<root>
<!-- 控制台输出 -->
<appender-ref ref="CONSOLE"/>
<!-- 不管什么包下的日志都输出文件 -->
<!--<appender-ref ref="ERROR"/>-->
</root>
“`
简单的说一下配置标签的作用
- property 设置全局属性可以在其他地方使用${key}的方式引用
- appender 配置日志的输出方式,文件的保存时间路径和编码等等
name: 就是本身的标识
class: 这个主要将两个ConsoleAppender将日志打印到控制台,RollingFileAppender将日志记录打印到文件
filter: 根据level日志级别保存到文件不满足级别要求的不保存到文件,譬如error.log只保存error的日志信息
rollingPolicy: 打印到日志的策略一般都是SizeAndTimeBasedRollingPolicy,当到达时间或者日志文件的大小时会创建新的日志文件
fileNamePattern: 日志文件保存路径 - logger 用来设置某一个包或者具体的某一个类的日志打印级别
name: 用来设置要打印类的包路径
additivity: 是否向上传递日志信息到root默认是true 如果改成false将不会在向root传递日志信息。
level: 日志级别TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
这里需要注意的是:假如设置的level过高additivity改成false的话,如果root是在控制台打印日志的话,如果level是error然后在打印错误信息的时候先经过logger将错误信息保存到日志,但是additivity是false不上报日志信息。所以root在控制台就不打印你错误的日志可能造成没有错误的假象。所以尽量不要这样配置。 - root 也是元素,但是它是根logger。只有一个level属性,应为已经被命名为”root”。而且是打印全局的日志
写在最后
本篇文章只是为了记录和分享自己学习日志配置的成果,为了其他小伙伴在需要的时候可以根据自己的修改能够达到自己的预期效果,如果有错误欢迎指出。谢谢!
最后如果有小伙伴想要更详细的了解logback的配置可以看下木棉花开的最全logback快速实践