高并发处理的日志优化

高并发处理的日志优化

有以下几个方面:

  1. 使用 Log4j2 的异步日志
  2. 合理设置日志级别
  3. 合理分割日志文件
  4. 容器环境下的日志使用ES(不建议使用NFS等网络文件夹)

1、Log4j2 的异步日志

Log4j2 的同步、异步性能比较:
alt text
Log4j2 与其它日志比较:
alt text

查看地址

Log4j2的结构:
alt text
Log4j2日志输出流程:
alt text

配置方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

<Configuration status="WARN">
<Appenders>
... <!-- your appenders here -->
</Appenders>
<Loggers>
<AsyncRoot level="info" includeLocation="false">
<AppenderRef ref="yourAppenderName"/>
</AsyncRoot>
<!-- 或者为特定logger配置 -->
<AsyncLogger name="com.example.MyClass" level="debug">
<AppenderRef ref="yourAppenderName"/>
</AsyncLogger>
</Loggers>
</Configuration>

注意:

  1. 异步日志可能会造成数据丢失,比如服务器宕机、容器宕机。
  2. 异步日志的顺序无法保证。可以配置异步线程池为 1

2、合理设置日志级别

避免日志滥用的最好方式是使用 DEBUG ,既有利于日志定位问题的速度,又能提高性能。

3、合理分割日志文件

一个示例:

1
2
3
4
5
6
7
8
9
10
11
<RollingFile name="ROLLING_FILE">
<PatternLayout pattern="${pattern}"/>
<Policies>
<!-- <OnStartupTriggeringPolicy />-->
<!--单个文件 超过2GB就分-->
<SizeBasedTriggeringPolicy size="2 GB"/>
<!-- <TimeBasedTriggeringPolicy />-->
</Policies>
<!--超过10个会自动删除-->
<DefaultRolloverStrategy max="10"/>
</RollingFile>

4、容器环境下的日志使用ES

Docker 环境

可直接使用宿主机

K8S 环境

使用临时路径并开启缓存,通过 Filebeat Sidecar 采集日志数据到 ES,通过Kibana查看日志。

本文地址: https://github.com/maxzhao-it/blog/post/2639945454/