此文已由作者易国强授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验。
为什么选择log4j2
log4j2相比于log4j1.x和logback来说,具有更快的执行速度。同时也支持日志的异步写入。还有很多有趣的特性,大家可以参考官方文档
在这篇文章里,对比描述了log4j2的优点,以及在传统的应用中如何进行日志的升级。在本文主要说下spring boot环境中如果使用lig4j2记录日志。
spring boot 默认采用Logback进行日志的记录。当然也是支持log4j的。想要替换,其实很简单,如下代码所示,我们将默认的logback日志依赖移除,加入log4j2的依赖即可。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId></dependency>
需要注意的是,如果项目中引入的其他依赖包中也使用了logback,编译时提示错误,以同样的方式将对应的依赖包exclusion即可。
如果我们需要自定义日志记录的格式和内容,我们可以在application.properties文件中指定日志文件的路径,如下所示:
logging.config=classpath:log4j2.xml
然后在resources下加入log4j2.xml文件,示例如下:
<?xml version="1.0" encoding="UTF-8"?><configuration status="info"> <!--先定义所有的appender--> <appenders> <!--这个输出控制台的配置--> <Console name="console" target="SYSTEM_OUT"> <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--> <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/> <!--这个都知道是输出日志的格式--> <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/> </Console> <!-- infoLog日志 --> <RollingFile name="infolog" fileName="log/info.log" filePattern="log/info.%d{yyyy-MM-dd}.log"> <ThresholdFilter level="INFO"/> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS} - %logger [%thread] %-5level %c %M:%L - %msg%n"/> <Policies> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> </Policies> </RollingFile> <!-- debugLog日志 --> <RollingFile name="debuglog" fileName="log/debug.log" filePattern="log/debug.%d{yyyy-MM-dd}.log"> <ThresholdFilter level="DEBUG"/> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS} - %logger [%thread] %-5level %c %M:%L - %msg%n"/> <Policies> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> </Policies> </RollingFile> <!-- errorLog日志 --> <RollingFile name="errorlog" fileName="log/faerror.log" filePattern="log/faerror.%d{yyyy-MM-dd}.log"> <ThresholdFilter level="ERROR"/> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS} - %logger [%thread] %-5level %c %M:%L - %msg%n"/> <Policies> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> </Policies> </RollingFile> <!-- warnLog日志 --> <RollingFile name="warnlog" fileName="log/warn.log" filePattern="log/warn.%d{yyyy-MM-dd}.log"> <ThresholdFilter level="WARN"/> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS} - %logger [%thread] %-5level %c %M:%L - %msg%n"/> <Policies> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> </Policies> </RollingFile> <!--监控相关日志 begin --> <RollingFile name="RollingFileHttpTrace" fileName="logs/trace/trace_http.log" filePattern="log/trace/trace_http.log.%d{yyyy-MM-dd}.txt"> <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss,SSS}],%m%n"/> <Policies> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> </Policies> </RollingFile> </appenders> <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效--> <loggers> <!-- 监控相关日志--> <logger name="httpTraceLog" level="INFO" additivity="false"> <appender-ref ref="RollingFileHttpTrace"/> </logger> <!--建立一个默认的root的logger--> <root level="INFO" includeLocation="true"> <appender-ref ref="errorlog"/> <appender-ref ref="warnlog"/> <appender-ref ref="infolog"/> </root> </loggers></configuration>
不足之处,欢迎指正,谢谢~
更多网易技术、产品、运营经验分享请点击。
相关文章:
【推荐】 块存储、文件存储、对象存储这三者的本质差别