1. 异步日志
- 原理:使用
AsyncAppender
将日志写入操作异步化。当应用程序调用日志记录方法时,不是直接将日志写入文件或其他目的地,而是将日志事件放入一个队列中,由专门的线程从队列中取出日志事件并进行实际的写入操作。
- 配置示例:
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="FILE" />
<queueSize>256</queueSize>
<discardingThreshold>0</discardingThreshold>
</appender>
queueSize
:指定队列的大小,若队列满了,新的日志事件根据discardingThreshold
策略处理。
discardingThreshold
:当队列剩余空间小于此阈值时,丢弃新的日志事件,0表示不丢弃。
2. 批量写入
- 原理:一些日志输出目标(如数据库)支持批量操作。可以配置
JDBCAppender
等相关Appender,将多个日志事件收集起来,批量写入数据库,减少数据库I/O次数。
- 配置示例:对于
JDBCAppender
,可设置batchSize
属性。
<appender name="JDBC" class="ch.qos.logback.classic.db.JDBCAppender">
<dataSource class="com.zaxxer.hikari.HikariDataSource">
<!-- 数据源配置 -->
</dataSource>
<sql>INSERT INTO log_table (message, timestamp) VALUES (?, ?)</sql>
<batchSize>50</batchSize>
</appender>
batchSize
表示一次批量写入数据库的日志记录数。
3. 合理选择日志级别
- 原理:在开发环境可以设置较低的日志级别(如
DEBUG
)以便调试,而在生产环境设置为较高的日志级别(如INFO
、WARN
、ERROR
)。这样可以减少不必要的日志记录,降低系统开销。
- 配置示例:在
logback.xml
中设置根日志级别。
<root level="info">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
4. 优化日志格式
- 原理:避免在日志格式中使用复杂的表达式或频繁调用耗时的方法。简洁的日志格式能减少格式化日志所需的时间。
- 示例:避免使用类似
%logger{0} - {调用复杂方法()}: %msg%n
,而应采用%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
这样简洁的格式。
5. 减少日志输出频率
- 原理:对于某些重复出现且不重要的日志,可以使用
ConditionalAppender
结合Evaluator
来控制日志输出频率。例如,对于每分钟只需要记录一次的某个特定类型的日志,可以进行相应配置。
- 配置示例:通过
OnMarkerEvaluator
和TimeSliceConditional
实现按时间间隔输出日志。
<appender name="CONDITIONAL" class="ch.qos.logback.classic.conditional.ConditionalAppender">
<evaluator class="ch.qos.logback.classic.conditional.evaluator.OnMarkerEvaluator">
<marker>MY_MARKER</marker>
<then>
<evaluator class="ch.qos.logback.classic.conditional.evaluator.TimeSliceConditional">
<timeSlice>60000</timeSlice> <!-- 每分钟输出一次 -->
</evaluator>
</then>
</evaluator>
<appender-ref ref="FILE" />
</appender>
6. 调整日志文件大小和滚动策略
- 原理:根据实际需求合理设置日志文件大小和滚动策略。如果文件设置过大,可能导致单个文件写入时间过长且不利于管理;如果设置过小,频繁滚动会增加I/O开销。
- 配置示例:使用
SizeAndTimeBasedRollingPolicy
进行按大小和时间滚动。
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>logs/app.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
maxFileSize
指定单个日志文件最大大小,maxHistory
指定保留的历史日志文件数量。