通过阅读本篇文章将了解到
- 1.日志输出到文件并根据LEVEL级别将日志分类保存到不同文件
- 2.通过异步输出日志减少磁盘IO提高性能
- 3.异步输出日志的原理
配置文件logback-spring.xml
<?xml version="1.0" encoding="utf-8"?><configuration> <property resource="logback.properties"/> <appender name="CONSOLE-LOG" class="ch.qos.logback.core.ConsoleAppender"> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%L] [%-5p] %m%n</pattern> </layout> </appender> <!--获取比info级别高(包括info级别)但除error级别的日志--> <appender name="INFO-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>DENY</onMatch> <onMismatch>ACCEPT</onMismatch> </filter> <encoder> <pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%L] [%-5p] %m%n</pattern> </encoder> <!--滚动策略--> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--路径--> <fileNamePattern>${LOG_INFO_HOME}//%d.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> </appender> <appender name="ERROR-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> </filter> <encoder> <pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%L] [%-5p] %m%n</pattern> </encoder> <!--滚动策略--> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--路径--> <fileNamePattern>${LOG_ERROR_HOME}//%d.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> </appender> <root level="info"> <appender-ref ref="CONSOLE-LOG" /> <appender-ref ref="INFO-LOG" /> <appender-ref ref="ERROR-LOG" /> </root></configuration>
- <root>
标签,必填标签,用来指定最基础的日志输出级别
- <appender-ref>标签,添加append
- <appender-ref>标签,添加append
- <append>
标签,通过使用该标签指定日志的收集策略
- name属性指定appender命名
- class属性指定输出策略,通常有两种,控制台输出和文件输出,文件输出就是将日志进行一个持久化。ConsoleAppender将日志输出到控制台
- <filter>
标签,通过使用该标签指定过滤策略
- <level>标签指定过滤的类型
- <level>标签指定过滤的类型
-
<encoder>标签,使用该标签下的<pattern>标签指定日志输出格式
- <rollingPolicy>
标签指定收集策略,比如基于时间进行收集
- <fileNamePattern>标签指定生成日志保存地址 通过这样配置已经实现了分类分天手机日志的目标了
- <fileNamePattern>标签指定生成日志保存地址 通过这样配置已经实现了分类分天手机日志的目标了
![](https://i-blog.csdnimg.cn/blog_migrate/df42e85e903a947f2feb3ed46f600882.png)
logback 高级特性异步输出日志
<!-- 异步输出 --> <appender name="ASYNC-INFO" class="ch.qos.logback.classic.AsyncAppender"> <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 --> <discardingThreshold>0</discardingThreshold> <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 --> <queueSize>256</queueSize> <!-- 添加附加的appender,最多只能添加一个 --> <appender-ref ref="INFO-LOG"/> </appender> <appender name="ASYNC-ERROR" class="ch.qos.logback.classic.AsyncAppender"> <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 --> <discardingThreshold>0</discardingThreshold> <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 --> <queueSize>256</queueSize> <!-- 添加附加的appender,最多只能添加一个 --> <appender-ref ref="ERROR-LOG"/> </appender>异步输出日志性能测试
服务器硬件
- CPU六核
- 内存 8G
测试工具Apache Jmeter同步输出日志
-
线程数:100
-
Ramp-Up Loop(可以理解为启动线程所用时间) :0 可以理解为100个线程同时启用
-
测试结果重点关注指标Throughput【TPS】吞吐量:系统在单位时间内处理请求的数量,在同步输出日志中TPS为44.2/sec
异步输出日志
-
线程数 100
-
Ramp-Up Loop:0
-
测试结果为497.5/sec,性能提升了10多倍!!!
异步日志输出原理
![](https://i-blog.csdnimg.cn/blog_migrate/6190e6692d150addd4052adb1b0bfe61.png)
protected void append(E eventObject) { if(!this.isQueueBelowDiscardingThreshold() || !this.isDiscardable(eventObject)) { this.preprocess(eventObject); this.put(eventObject); } }
E e = parent.blockingQueue.take();aai.appendLoopOnAppenders(e);
![](https://i-blog.csdnimg.cn/blog_migrate/54274125716d5f9a3e316f1370dcf9f5.png)
异步输出日志<?xml version="1.0" encoding="utf-8"?><configuration> <property resource="logback.properties"/> <appender name="CONSOLE-LOG" class="ch.qos.logback.core.ConsoleAppender"> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%L] [%-5p] %m%n</pattern> </layout> </appender> <!--获取比info级别高(包括info级别)但除error级别的日志--> <appender name="INFO-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>DENY</onMatch> <onMismatch>ACCEPT</onMismatch> </filter> <encoder> <pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%L] [%-5p] %m%n</pattern> </encoder> <!--滚动策略--> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--路径--> <fileNamePattern>${LOG_INFO_HOME}//%d.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> </appender> <appender name="ERROR-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> </filter> <encoder> <pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%L] [%-5p] %m%n</pattern> </encoder> <!--滚动策略--> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--路径--> <fileNamePattern>${LOG_ERROR_HOME}//%d.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> </appender> <!-- 异步输出 --> <appender name="ASYNC-INFO" class="ch.qos.logback.classic.AsyncAppender"> <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 --> <discardingThreshold>0</discardingThreshold> <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 --> <queueSize>256</queueSize> <!-- 添加附加的appender,最多只能添加一个 --> <appender-ref ref="INFO-LOG"/> </appender> <appender name="ASYNC-ERROR" class="ch.qos.logback.classic.AsyncAppender"> <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 --> <discardingThreshold>0</discardingThreshold> <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 --> <queueSize>256</queueSize> <!-- 添加附加的appender,最多只能添加一个 --> <appender-ref ref="ERROR-LOG"/> </appender> <root level="info"> <appender-ref ref="CONSOLE-LOG" /> <appender-ref ref="INFO-LOG" /> <appender-ref ref="ERROR-LOG" /> </root></configuration>LOG_ERROR_HOME=C://Users//hetiantian//Desktop//log//errorLOG_INFO_HOME=C://Use