一、为什么使用异步日志Why
为提高程序性能,尽量默认都使用异步日志,如果不使用,可能日志在打包的时候,会占用大量磁盘IO和CPU,导致程序性能下降
二、依赖
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.20</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>log4j-over-slf4j</artifactId> <version>1.7.20</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.1.7</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.1.7</version> </dependency>
注意:log4j-over-slf4j 和 slf4j-log4j12会循环引用,导致内存溢出。
三、logback配置文件结构,重点是<appender/> <logger/> <root/>
1、根节点<configuration>,scan重新加载,检查时间,打印logback状态信息,一般不设置属性
<configuration scan="true" scanPeriod="60 seconds" debug="false"></configuration>
2. 设置上下文名称:<contextName>myAppName</contextName>,一般不设置
3. 设置变量: <property name="APP_Name" value="myAppName" />,通过<property>定义的值会被插入到logger上下文中
4. 获取时间戳字符串:<timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>,一般不设置
5. <appender>, 是负责写日志的组件,<appender>有两个必要属性name(名称)和class(如何打印日志)
常用class:ConsoleAppender(打印日志到控制台)/RollingFileAppender(滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件)
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${COMMON_PATTERN}</pattern>
</layout>
</appender>
<appender name="abc-log" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>logs/abc.log</File> <encoder> <pattern>${COMMON_PATTERN}</pattern> </encoder> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>logs/abc.%d{yyyy-MM-dd}.log.zip</FileNamePattern> <MaxHistory>7</MaxHistory> <CleanHistoryOnStart>true</CleanHistoryOnStart> </rollingPolicy> </appender>
6.<logger>,设置日志打印级别以及通过指定<appender>
name: 用来指定受此loger约束的某一个包或者具体的某一个类,是一个路径
level: 用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
addtivity: 是否向上级loger传递打印信息。默认是true,如果传递有可能打印多次,一般设置为false
子节点<appender-ref>:实际指向<appender>
<logger name="aaa" level="TRACE" additivity="false"> <appender-ref ref="trace-async-appender"/> <appender-ref ref="console"/> </logger>
6. <root>,也是<logger>元素,但是它是根logger,只有一个level属性,一般是WARN级别往上
<root level="WARN"> <appender-ref ref="console"/> <appender-ref ref="abc-log"/> </root>
7. 异步打印日志,先把日志写入阻塞队列,然后才写到磁盘上
<appender-ref>实际指向<appender>,把原来的同步打日志的<appender>再包一层,因为异步日志并不自己打日志,而是提供一种方式,所以必须要具体到某个appender上
8. 屏蔽某个包的日志
<logger name="packageName" level="OFF"></logger>
9. 例子
<?xml version="1.0" encoding="UTF-8"?> <configuration> <property name="LOG_DIR" value="logs"/> <property name="COMMON_PATTERN" value="%date{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{0} - %msg%n"/> <!-- - - - - - - - appender - - - - - - - --> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>${COMMON_PATTERN}</pattern> </layout> </appender> <appender name="abc-log" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>logs/abc.log</File> <encoder> <pattern>${COMMON_PATTERN}</pattern> </encoder> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>logs/abc.%d{yyyy-MM-dd}.log.zip</FileNamePattern> <MaxHistory>7</MaxHistory> <CleanHistoryOnStart>true</CleanHistoryOnStart> </rollingPolicy> </appender> <appender name="trace-async-appender" class="ch.qos.logback.classic.AsyncAppender"> <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 --> <queueSize>512</queueSize> <!-- 添加附加的appender,最多只能添加一个 --> <appender-ref ref="abc-log"/> </appender> <logger name="aaa" level="TRACE" additivity="false"> <appender-ref ref="trace-async-appender"/> <appender-ref ref="console"/> </logger> <root level="WARN"> <appender-ref ref="console"/> <appender-ref ref="abc-log"/> </root> </configuration>
参考: