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

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

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

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

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

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

Spring Boot 学习系列(06)—采用log4j2记录日志的更多相关文章

  1. spring boot 学习(六)spring boot 各版本中使用 log4j2 记录日志

    spring boot 各版本中使用 log4j2 记录日志 前言 Spring Boot中默认日志工具是 logback,只不过我不太喜欢 logback.为了更好支持 spring boot 框架 ...

  2. Spring Boot 2 中如何使用 Log4j2 记录日志

    上一篇我们介绍了Spring Boot 2.x中默认日志框架Logback的使用.今天继续说说日志,接下来我们要讲是前段时间爆出核弹漏洞的Log4j2.虽然出了漏洞,让很多小伙伴痛苦了1-2周(加班) ...

  3. Spring Boot 学习系列(10)—SpringBoot+JSP的使

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 解决问题 随着spring boot 框架的逐步使用,我们期望对于一些已有的系统进行改造,做成通用的脚手架, ...

  4. Spring Boot 学习系列(03)—jar or war,做出你的选择

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 两种打包方式 采用Spring Boot框架来构建项目,我们对项目的打包有两种方式可供选择,一种仍保持原有的 ...

  5. Spring Boot 学习系列(05)—自定义视图解析规则

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 自定义视图解析 在默认情况下Spring Boot 的MVC框架使用的视图解析ViewResolver类是C ...

  6. Spring Boot 学习系列(09)—自定义Bean的顺序加载

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Bean 的顺序加载 有些场景中,我们希望编写的Bean能够按照指定的顺序进行加载.比如,有UserServ ...

  7. Spring Boot 学习系列(08)—自定义servlet、filter及listener

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 传统的filter及listener配置 在传统的Java web项目中,servlet.filter和li ...

  8. Spring Boot 学习系列(04)—分而治之,多module打包

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 明确功能,各司其职 在一个结构清晰的项目中,一个没有module划分的结构显然不是最佳实践.有人会说可以在同 ...

  9. Spring Boot 学习系列(序)—Spring Boot

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Spring Boot? Spring Boot 是由pivotal团队提供的一个基于Spring的全新框架 ...

随机推荐

  1. oracle实例侦听

    在oracle服务器端命令行中执行 C:\>lsnrctl进入到 LISNRCTL>界面 键入help字符会回显相关的帮助命令

  2. css字体中px和em的区别

    2015-05-28 昨天看到一个不错的纯css3表格样式,看到代码后注意到了作者用的都是em在控制大小.顿时想到了自己习惯使用的px长度单位,就查了关于两者的区别.综合前辈们的总结记录整理下来,以供 ...

  3. Selenium Webdriver——Table类封装

    WebTable.java import java.util.List; import org.openqa.selenium.By; import org.openqa.selenium.WebEl ...

  4. 「小程序JAVA实战」小程序查看视频发布者信息(64)

    转自:https://idig8.com/2018/09/24/xiaochengxujavashizhanxiaochengxuchakanshipinfabuzhexinxi63/ 当我们点击右下 ...

  5. delphi TEncoding

    #include <tchar.h> #include <memory> //For STL auto_ptr class //------------------------ ...

  6. FastJson bean序列化属性顺序问题

    fastjson序列化一个java bean,默认是根据fieldName的字母序进行序列化的,你可以通过ordinal指定字段的顺序,这个特性需要1.1.42以上版本.示例如下. import co ...

  7. out.println(session.getLastAccessedTime());的返回值到底是毛线意思???

    out.println(session.getLastAccessedTime());这个语句是输出最后一次成功获取session对象Attribute值的一个指令, 他的返回值是一个long型数据, ...

  8. Vue SPA应用中使用Layer的iframe 弹出层,并且传值

    问题来源: BOOS 竟然说喜欢有可移动可最大化的弹出层,这!!! SPA 模式下就是这种引入Vue.js的写法 layer.open({ type: , area: ['840px', '550px ...

  9. [leetcode]141. Linked List Cycle判断链表是否有环

    Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it without using ext ...

  10. oracle触发器--if else demo

    CREATE OR REPLACE Trigger trig_solr_index_el_lesson After Update of lessonid, lessonname, lessongoal ...