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

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

为什么选择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. CNN网络参数

    卷积神经网络 LeNet-5各层参数详解 LeNet论文阅读:LeNet结构以及参数个数计算     LeNet-5共有7层,不包含输入,每层都包含可训练参数:每个层有多个Feature Map,每个 ...

  2. linux版飞信安装

    下载安装包; http://www.it-adv.net/fetion/libraryrh4x32.tar.gz  [支持库] http://www.it-adv.net/fetion/downloa ...

  3. 普通方法调用,Invoke,begininvoke三者的区别总结及异步与同步的区别总结

    (1)普通方法调用(直接调用)与Invoke()方法调用方法 使用的线程Id是一样的 即属于同步. (2)BeginInvoke(<输入和输出变量>,AsyncCallback callb ...

  4. OpenCL NativeKernel 计算矩阵乘法

    ▶ 使用函数 clEnqueueNativeKernel 来调用 C/C++ 本地函数(在 OpenCL 中将其看做回调函数),使用本地编译器(而不是 OpenCL 编译器)来编译和执行内核 ● 代码 ...

  5. URL的名称设置

    1. 对于login.html 此为跳转文件, 加入了参数nid,在views.py中进行关于request.POST.get()的文件中获取 <a href='/detail?nid={{k} ...

  6. 有单例模式 Singleton 涉及的一些防止类被继承的东西

    c#中 : ------------------------------- 当对一个类应用 sealed 修饰符时,此修饰符会阻止其他类从该类继承. java中: ------------------ ...

  7. 前端开发之jQuery属性和文档操作

    主要内容: 1.jQuery属性操作 2.jQuery文档操作 一.jQuery属性操作 1.什么是jQuery的属性操作? jQuery的属性操作模块包括四个部分:html属性操作,dom属性操作, ...

  8. css常用属性初总结:伪元素和伪元素

    前面几遍中我们分别说到了id选择器和class选择器,以及它们的区别和联系,下面大家一起来探究一下神奇的为类和伪元素吧. 其实以前我对伪类和伪元素也是搞得稀里糊涂的,现在决定剥开它神秘的外衣,首先,究 ...

  9. 新手C#异常的学习2018.08.07

    异常是在程序执行期间出现的问题.C# 中的异常是对程序运行时出现的特殊情况的一种响应,比如尝试除以零. class Program { static void Main(string[] args) ...

  10. SAP middb主键加索引

    alter table DEPTBIGCPDL_DBC drop constraint DEPTBIGCPDL_DBC_PK CREATE UNIQUE INDEX TABLEAU_USER.DEPT ...