Logback的使用
目录
1 logback大致介绍
Logback是由log4j创始人设计的另外一种开源日志组件,性能比log4j要好
Logback主要分为3个模块:
logback-core:其他两个模块的基础模块
logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4jAPI
logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能
logback组件之间的关系
1 Logger:日志的记录器,把它关联到应用的对应context上后,主要用于存放日志对象,也可以定义日志类型,级别
2 Appender:用于指定日志输出的目的地,目的地可以是控制台,文件,数据库等。
3 Layout:负责把事件转换成字符串,格式化的日志信息的输出。在logback的Layout对象被封装在encoding中。
logback读取配置文件顺序:
logback.groovy
logback-test.xml
logback.xml
如果均不存在会采用默认配置
2 使用logback配置文件输出日志
引用相关依赖:
<dependencies>
<!--slf4j日志门面-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<!-- logback相关依赖-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.7</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
2.1 将日志输出到控制台
配置相关日志文件:logback.xml
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!--配置集中管理属性 我们可以直接更改属性value的值 格式: ${name}-->
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n"/>
<appender name="console" class = "ch.qos.logback.core.ConsoleAppender">
<!--控制输出流对象 默认System.out改为System.err-->
<target>System.err</target>
<!--引用上面的属性 用${name}-->
<encoder class = "ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!--root logger-->
<root level = "ALL">
<appender-ref ref="console"/>
</root>
</configuration>
测试类代码:
public static final Logger LOGGER = LoggerFactory.getLogger(LogBackTest.class);
@Test
public void test(){
LOGGER.error("error");
LOGGER.warn("warn");
LOGGER.info("info");
LOGGER.debug("debug");
LOGGER.trace("trace");
}
输出结果:

以上是我们将日志文件输出到控制台上的,但是平时在我们开发中,我们一般都将日志输出到控制台和日志文件上。
2.2 将日志输出到控制台和文件
我们可以在我们刚刚的配置文件上加上输出到配置文件的配置:
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!--配置集中管理属性 我们可以直接更改属性value的值 格式: ${name}-->
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n"/>
<appender name="console" class = "ch.qos.logback.core.ConsoleAppender">
<!--控制输出流对象 默认System.out改为System.err-->
<target>System.err</target>
<!--引用上面的属性 用${name}-->
<encoder class = "ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<property name="log_dir" value="/logs"/>
<appender name="file" class = "ch.qos.logback.core.FileAppender">
<!--控制输出流对象 默认System.out改为System.err-->
<file>${log_dir}/logback.log</file>
<!--引用上面的属性 用${name}-->
<encoder class = "ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!--root logger-->
<root level = "ALL">
<appender-ref ref="console"/>
<appender-ref ref="file"/>
</root>
</configuration>
在用之前的测试类代码:可以发现日志文件已经输出到控制台和日志文件中了(因为我的windoes系统,所以我的直接输出到了D盘的根目录下D:\logs\logback.log)。日志就不在粘贴了。
2.3 将日志以html的文件进行输出
除此之外,我们还可以将日志信息以html的方式输出:
我们可以将一下配置将在上述配置文件中:
<appender name="htmlFile" class="ch.qos.logback.core.FileAppender"> <file>${log_dir}/logback.html</file> <!--引用上面的属性 用${name}--> <encoder class = "ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <layout class = "ch.qos.logback.classic.html.HTMLLayout"> <pattern>%-5level%d{yyyy-MM-dd HH:mm:ss.SSS}%c%M%L[%thread]%m%n</pattern> </layout> <pattern>${pattern}</pattern> </encoder> </appender><root level = "ALL"> <appender-ref ref="htmlFile"/> </root>
用之前的测试类进行测试,我们会发现我们的目下出现了一个html文件:打开之后:

里面记录了我们输出的各种信息
2.4 将日志文件进行压缩拆分
当我们的日志文件较大时,我们可以自己定义日志文件拆分规则,比如我想让日志文件超过1MB就进行拆分。可以这样配置
<!-- 日志拆分和归档压缩的appender对象-->
<appender name="rollFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log_dir}/roll_logback.log</file>
<!--日志消息格式配置-->
<encoder class = "ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<!--指定拆分规则-->
<rollingPolicy class = "ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log_dir}/rolling.%d{yyyy-MM-dd}.log%i.gz</fileNamePattern>
<!--按照文件大小拆分-->
<maxFileSize>1MB</maxFileSize>
</rollingPolicy>
</appender>
将此日志文件与2.2日志文件进行整合,就可以按照规则来拆分日志了
为了便于测试,将之前测试类的代码循环10000次。
@Test
public void test(){
for (int i = 0; i < 10000; i++) {
LOGGER.error("error");
LOGGER.warn("warn");
LOGGER.info("info");
LOGGER.debug("debug");
LOGGER.trace("trace");
}
}
结果:

除此之外,还有许多日志级别的过滤器。例如:
<appender name="rollFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log_dir}/roll_logback.log</file>
<!--日志消息格式配置-->
<encoder class = "ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<!--指定拆分规则-->
<rollingPolicy class = "ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log_dir}/rolling.%d{yyyy-MM-dd}.log%i.gz</fileNamePattern>
<!--按照文件大小拆分-->
<maxFileSize>1MB</maxFileSize>
</rollingPolicy>
<!-- 日志级别过滤器-->
<filter class = "ch.qos.logback.classic.filter.LevelFilter">
<!--日志过滤规则 超过ERROR级别进行过滤 没有超过进行过滤-->
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
过滤器被添加到<Appender> 中,将过滤器的日志界别设置为INFO,所有INFO级别的日志交给appender处理,非INFO级别的日志,被过滤掉。
2.5 异步日志
为了提升效率,我们也可以将日志进行异步输出。
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!--配置集中管理属性 我们可以直接更改属性value的值 格式: ${name}-->
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n"/>
<!-- 日志拆分和归档压缩的appender对象-->
<appender name="rollFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log_dir}/roll_logback.log</file>
<!--日志消息格式配置-->
<encoder class = "ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<!--指定拆分规则-->
<rollingPolicy class = "ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log_dir}/rolling.%d{yyyy-MM-dd}.log%i.gz</fileNamePattern>
<!--按照文件大小拆分-->
<maxFileSize>1MB</maxFileSize>
</rollingPolicy>
<!-- 日志级别过滤器-->
<filter class = "ch.qos.logback.classic.filter.LevelFilter">
<!--日志过滤规则 超过ERROR级别进行过滤 没有超过进行过滤-->
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--异步日志-->
<appender name="async" class="ch.qos.logback.classic.AsyncAppender">
<!--指定某个具体的appender-->
<appender-ref ref = "rollFile"/>
</appender>
<!--root logger-->
<root level = "ALL">
<appender-ref ref="console"/>
<!-- <appender-ref ref="file"/>
<appender-ref ref="htmlFile"/>-->
<appender-ref ref="async"/>
</root>
<!-- 自定义logger对象 additivity = "false" 自定义logger对象是否继承rootLogger-->
<logger name = "com.liujun" level = "info" additivity = "false">
<appender-ref ref = "console"/>
</logger>
</configuration>

浙公网安备 33010602011771号