log4j2 使用
1、pom 依赖
<dependencies>
<dependency>
<artifactId>log4j-slf4j-impl</artifactId>
<groupId>org.apache.logging.log4j</groupId>
<version>2.19.0</version>
</dependency>
</dependencies>
log4j-slf4j-impl 已经依赖了 log4j-api, log4j-core 两个依赖
这里为了使用 slf4j做日志门面,所以直接用了 log4j-slf4j-impl,其它做法可以直接引入 log4j-api 和 log4j-core 包也是一样的效果
比如,如果不想用 slf4j,那依赖是这样子的
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.19.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.19.0</version>
</dependency>
但使用 slf4j 和直接使用 log4j, 在使用上有区别的:
-
使用 slf4j:
Logger log = LoggerFactory.getLogger(Tank.class);
(推荐使用 slft4j, 它是日志的门面,底层实现可以使用 log4j,也可以使用 logback,特别对于写公共模块更为重要)
-
使用 log4j2
Logger log = LogManager.getLogger(Tank.class);
log4j2.xml 模板
(只引入依赖,没有配置 log4j2.xml 模板是不行的~ 然后,把这个 log4j2.xml 文件放到 resources 下面即可。 文件名也要用 log4j2.xml, 如果用了log4j.xml 貌似是不行的,当然,如果模板用错了,也会报错~)
<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出 -->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数 -->
<configuration status="WARN" monitorInterval="10">
<Properties>
<Property name="LOG_HOME">./logs</Property>
<Property name="MODLUE_NAME">algo-module</Property>
<Property name="INFO_FILE_NAME">${MODLUE_NAME}_info.log</Property>
<Property name="INFO_ARCHIVE_NAME">${MODLUE_NAME}_info_%d{yyyyMMdd}.log
</Property>
<Property name="ERROR_FILE_NAME">${MODLUE_NAME}_error.log</Property>
<Property name="ERROR_ARCHIVE_NAME">${MODLUE_NAME}_error_%d{yyyyMMdd}.log
</Property>
<property name="BUFFER_SIZE">524288</property>
<property name="ROLLING_INTERVAL">1</property>
</Properties>
<!--先定义所有的appender -->
<appenders>
<!--这个输出控制台的配置 -->
<console name="Console" target="SYSTEM_OUT">
<!--输出日志的格式 -->
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss}|%c|%msg%n"/>
<Filters>
<ThresholdFilter level="debug" onMatch="ACCEPT"
onMismatch="DENY"/>
</Filters>
</console>
<RollingRandomAccessFile name="RollingFileInfo"
fileName="${LOG_HOME}/${INFO_FILE_NAME}"
filePattern="${LOG_HOME}/${INFO_ARCHIVE_NAME}"
immediateFlush="true" bufferSize="${BUFFER_SIZE}" append="true">
<PatternLayout>
<pattern>${sys:log_prefix:-}%d{yyyyMMddHHmmss}|${LOG_CODE}|%-level|%c|%msg%n
</pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="${ROLLING_INTERVAL}"
modulate="true"/>
</Policies>
<!-- 只记录info和warn级别信息 -->
<Filters>
<!-- DENY 不容许error级别以上写入该文件 NEUTRAL 中立, 上下两个条件组合,取中间值 -->
<!-- <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL" /> -->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</RollingRandomAccessFile>
<!--immediateFlush 是否立即写入, bufferSize 缓存大小 -->
<RollingRandomAccessFile name="RollingFileError"
fileName="${LOG_HOME}/${ERROR_FILE_NAME}"
filePattern="${LOG_HOME}/${ERROR_ARCHIVE_NAME}"
immediateFlush="true" bufferSize="${BUFFER_SIZE}" append="true">
<PatternLayout>
<pattern>${sys:log_prefix:-}%d{yyyyMMddHHmmss}|${LOG_CODE}|%-level|%c|%msg%n
</pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="${ROLLING_INTERVAL}"
modulate="true"/>
</Policies>
<!-- 只记录error以上级别信息 -->
<Filters>
<ThresholdFilter level="error" onMatch="ACCEPT"
onMismatch="DENY"/>
</Filters>
</RollingRandomAccessFile>
</appenders>
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
<loggers>
<!--过滤掉spring和mybatis的一些无用的DEBUG信息 -->
<logger name="org.mybatis" level="DEBUG"></logger>
<root level="INFO">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileError"/>
</root>
</loggers>
</configuration>
log4j2.yml 模板
configutation:
name: Default
Properties:
Property:
- name: service-name
value: task-service
- name: log-path
value: "logs"
- name: console-pattern
value: "%clr{[%X{TRACE_ID}] %d{yyyy-MM-dd HH:mm:ss.SSS}}{faint} %clr{%5p} %X{X-B3-TraceId} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n%xEx"
- name: file-pattern
value: "[%X{TRACE_ID}] %d{yyyy-MM-dd HH:mm:ss.SSS} %5p %X{X-B3-TraceId} --- [%15.15t] %-40.40c{1.}{cyan} : %m%n%xEx"
Appenders:
#输出到控制台
Console:
name: CONSOLE
target: SYSTEM_OUT
PatternLayout:
pattern: ${console-pattern}
# 输出到文件
RollingFile:
- name: FILE
fileName: ${log-path}/${service-name}.log
filePattern: "${log-path}/${service-name}.%d{yyyy-MM-dd}.log"
PatternLayout:
pattern: ${file-pattern}
Policies:
# 按时间做文件触发器,这个interval 是1 , 单位就得看 filePattern 这个配置的是什么,比如这里是 dd 即每一天一个名字,所以是一天一个文件
# 如果filePatern 写的是 ${log-path}/${service-name}.%d{yyyy-MM-dd-HH}.log 那就是一个小时生成一个文件(HH是24小时制,hh是12小时制)
TimeBasedTriggeringPolicy:
interval: 1
SizeBasedTriggeringPolicy:
# 这个是文件大小做触发策略,单位可以配置 KB,MB,GB,嗯,这里10MB的意思是,如果一个文件大小超过10MB之后,会把旧数据抛弃掉,记录新数据,所以如果配置了这个,可能会把一些比较旧的日志数据丢弃掉,看实际业务需求吧
size: 10MB
DefaultRollOverStrategy:
max: 30
Loggers:
Root:
level: info
AppenderRef:
- ref: CONSOLE
- ref: FILE
Logger:
- name: org.springframework.web.servlet.DispatcherServlet
# additivity: false
level: debug
AppenderRef:
- ref: FILE
- ref: CONSOLE
- name: com.carrot.demo
# additivity: false
level: info
AppenderRef:
- ref: FILE
- ref: CONSOLE
记录一个小问题
- 日志出现大量的 ESC符号,这个貌似是一个日志带样式的输出,解析不了还是啥的,所以就“乱码”了,比如刚才这个 log4j2.yml 的 pattern, 一个 console-pattern 会带着比较多的 %clr 的东西,效果就是日志有颜色区分,更加好看了。。。
但是如果把这个带上到,使用 cat , more 去看的话,就会出现乱乱的字符问题。用 tail -f 貌似又不会有这样的问题。不过,总的来说,问题不大吧。也不会太在意。emmm。。。