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。。。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南