Spring Boot 学习系列(06)—采用log4j2记录日志

此文已由作者易国强授权网易云社区发布。


欢迎访问网易云社区,了解更多网易技术产品运营经验。


为什么选择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>
  • 不足之处,欢迎指正,谢谢~


免费体验云安全(易盾)内容安全、验证码等服务


更多网易技术、产品、运营经验分享请点击


相关文章:
【推荐】 块存储、文件存储、对象存储这三者的本质差别

posted @ 2018-10-31 15:45  tianshidan1998  阅读(335)  评论(0编辑  收藏  举报