发布时间:2023-09-14 19:30
1)1996年左右,以Ceki Gulcu为首的团队创建了Log4j,后被Apache收归麾下;
2)2002年Sun公司推出了日志库JUL(java util logging),基本照搬Log4j,后来Sun也被Google收购,JUL自然也成为Apache的一员;
3)后来Apache又推出了Commons Logging,组成了日志接口Commons Logging,实现可选Log4j或JUL的架构;
4)2006年Ceki Gulcu离开Apache,先后创建了Slf4j和Logback,组成了日志接口Slf4j,实现以Logback为主的架构;
5)至此,java界两大日志框架阵营形成,主流应用都选这两个组合中的一个,由于Slf4j在各项性能及接入方式上都优于Commons Logging,而且Slf4j完全开源、而Commons Logging部分开源,所以Slf4j大有后来者居上的趋势。
现在,如果接手老项目,就沿用以前的的日志框架;如果是新建项目,建议用Slf4j的组合。
1)约定
<dependency>
<groupId>ch.qos.logbackgroupId>
<artifactId>logback-classicartifactId>
<version>1.0.6version>
dependency>
2)配置
在用户没有对logback进行任何配置的情况下,logback会使用默认配置输出简单的日志到控制台。但在实际工作中,我们通常对项目日志的输出有很多要求,比如将日志文件按天分割、将日志文件按大小进行分割、定期删除旧日志等。因此需要在项目中创建logback的配置文件,当在项目的classpath路径下存在logback.xml(或者logback-test.xml、logback.groovy),logback框架能够自动扫描到它并读取配置。
配置文件的根节点是configuration,它有三个属性,scan、scanPeriod、debug,一般都采用默认设置
scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效,默认的时间间隔为1分钟。
debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态,默认值为false。
先看一段简单的配置示例
<configuration scan="true" scanperiod="10 seconds">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%npattern>
encoder>
appender>
<root level="debug">
<appender-ref ref="STDOUT" />
root>
configuration>
configuration节点主要又包含appdender、logger、root三个标签,如下图:
首先是appender,它用来配置日志的输出位置、格式等等,这里介绍几个常用的appender:
ConsoleAppender 顾名思义,即在控制台上输出,示例如下
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender" >
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}: %msg%npattern>
encoder>
appender>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
root>
configuration>
RollingFileAppender将FileAppender都是将日志输出到文件,RollingFileAppender将FileAppender的功能进行扩展,提供了切割日志文件的功能。例如,RollingFileAppender可以记录日志到一个名为log.txt的文件,一旦满足一定条件,将其日志目标更改为另一个文件。
在使用时,RollingFileAppender必须同时具有RollingPolicy和TriggeringPolicy设置。但是,如果它的RollingPolicy也实现TriggeringPolicy接口,那么只需要显式地指定前者。
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/logback.log.%d{yyyy-MM-dd}fileNamePattern>
<MaxHistory>1MaxHistory>
rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}: %msg%npattern>
encoder>
appender>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%npattern>
<charset>UTF-8charset>
encoder>
appender>
<root level="DEBUG">
<appender-ref ref="FILE" />
root>
configuration>
然后是root,它可以指定日志的默认输出级别,但是我们在代码中设置的日志输出级别,会覆盖root的设置,root的配置,上面两个实例中都有。
另外日志级别为:TRACE < DEBUG < INFO < WARN < ERROR。
最后,写一个总的示例,一般的项目就写这样的配置文件就可以使用了
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender" >
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}: %msg%npattern>
encoder>
appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/logback.log.%d{yyyy-MM-dd}fileNamePattern>
<MaxHistory>1MaxHistory>
rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%npattern>
<charset>UTF-8charset>
encoder>
appender>
<root level="warn">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
root>
configuration>
1)实际开发中如果是springboot项目,不需要我们添加logback的依赖,这是因为spring-boot-starter这个依赖其中包含了 spring-boot-starter-logging,这个包下有所有日志框架需要的依赖(也包含log4j的依赖);
2)如果项目中使用了lombok插件,写日志时甚至都不用创建日志对象,只要在需要日志的类上加一个@Slf4j,就可以直接在方法中用 log.info();或者log.error();等写日志了,非常简单方便。
@Slf4j注解是lombok的一个注解,它会为类提供一个属性名为log的slf4j日志对象。