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

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

为什么选择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. 20165233 Java第八、十五章学习总结

    20165233 2017-2018-2 <Java程序设计>第六周学习总结 教材学习内容总结 ch08 基础:String类 重点:StringTokenizer类.Scanner类:获 ...

  2. python 简单爬虫获取气象数据发送气象定时报-预报预警信息及时推送及阿里云短信群发接口

    !/usr/bin/python #encoding=utf-8 #Author:Ruiy #//////////////////////////////////////////////////// ...

  3. Redis Windows环境安装

    1.下载Windows 版本 Redis: https://github.com/ServiceStack/redis-windows 2. 解压文件: F:\开源代码学习\01_Redis 打开 目 ...

  4. Cardboard Talk02 Accelerometer

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Android studio 3.0.0 | Cardboard 1.0 在深入讨论具体实现之前,有必要了解一下Andro ...

  5. C语言链表实现

    #define _CRT_SECURE_NO_WARNINGS #include "stdio.h" #include "stdlib.h" typedef s ...

  6. go_Map

    go语言中map使用哈希表,必须可以比较相等 除了slice,map,function的内建类型都可以作为key Struct类型不包括上述字段,也可作为key map中的key是无序的 packag ...

  7. C# Action

    Action<T> Delegate Encapsulates a method that has a single parameter and does not return a val ...

  8. mysql 一次性插入上万条数据测试专用

    无聊期间 记录下 mysql 一次性插入上万条数据 测试的时候可以用 首先 创建一个表 t3 create table t3(id int)ENGINE = MyISAM; \d //    表示吧m ...

  9. sqlserver 必须声明标量变量 "***"。

    发现在navicat premium上执行报这个异常,在sqlserver上不报,想到我之前的文章用存储过程时mysql里有个分割符,去掉“:”果然执行成功. DECLARE @countlmc IN ...

  10. Oracle ADF 创建序列

    双击VO,打开Attribute 标签页在弹出的窗口中选择Default Value Type 为“Expression”, value 的值为:(new oracle.jbo.server.Sequ ...