1. 概述

官方参考文档:Log4j

Apache Log4j2 是对原先的 Log4j 项目的升级版本,参考了 logback 的一些优秀的设计,并且修复了一些问题,因此带来了一些重大的提升。

  • 异常处理,在 logback 中,Appender 中的异常不会被应用感知到,但是在 log4j2 中,提供了一些异常处理机制;
  • 性能提升,log4j2 相较于 log4j 和 logback 都具有明显的性能提升,有18倍性能提升;
  • 自动装载配置,参考了 logback 的设计,当然会提供自动刷新参数配置,最实用的就是我们在生产上可以动态的修改日志级别而不需要重启应用;
  • 无垃圾机制,log4j2 在大部分情况下,都可以使用其设计的一套无垃圾机制(对象重用、内存缓冲),避免频繁的日志收集导致的 JVM gc。

参考:https://logging.apache.org/log4j/2.x/

2. 案例与解析

2.1 引入依赖

SpringBoot 的 starter 自带的是 logback 日志,若要使用 log4j2 日志,需要引入对应依赖。

logback 日志和 log4j2 日志都是对 slf4j 门面的实现,只能存在一个,且必须存在一个,不存在或者存在多个都会出错。如果两者都存在就会出现以下的问题:

因此,在使用 log4j2 日志时,必须要在依赖中把 logback 给 exclude 掉。 并且,使用 log4j2 日志还需要适配器 log4j-slf4j-impl,它跟 SpringBoot 的 starter 自带的 log4j-to-slf4j 是相互冲突的,因此还需要将 log4j-to-slf4j 也 exclude 掉。

因为 SpringBoot 的 starter 中已经带有 slf4j 门面了,因此无需再引入 slf4j 依赖。

<!-- 使用 log4j2 的适配器进行绑定 -->
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId><version>2.19.0</version>
</dependency><!-- log4j2 日志门面 -->
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.19.0</version>
</dependency><!-- log4j2 日志实面 -->
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.19.0</version>
</dependency>

2.2 定义日志文件 log4j2.xml

<?xml version="1.0" encoding="UTF-8" ?>
<configuration status="warn" monitorInterval="5"><properties><property name="LOG_HOME" value="logs"/></properties><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] [%-5level] %c{36}:%L --- %m%n"/></Console><File name="File" fileName="${LOG_HOME}/file-log4j2.log"><PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%-5level] %l %c{36} - %m%n"/></File><RandomAccessFile name="AccessFile" fileName="${LOG_HOME}/myAcclog.log" immediateFlush="true"><PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%-5level] %l %c{36} - %m%n"/></RandomAccessFile><RollingFile name="RollingFile" fileName="${LOG_HOME}/log4j2.log"filePattern="logs/log4j2.%d{yyyy-MM-dd-HH-mm}.%i.log"><ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%-5level] %l %c{36} - %msg%n"/><Policies><OnStartupTriggeringPolicy/><SizeBasedTriggeringPolicy size="10 KB"/><TimeBasedTriggeringPolicy/></Policies><DefaultRolloverStrategy max="30"/></RollingFile></Appenders><Loggers><Root level="INFO"><AppenderRef ref="Console"/><AppenderRef ref="File"/><AppenderRef ref="AccessFile"/><AppenderRef ref="RollingFile"/></Root></Loggers>
</configuration>

2.3 在 SpringBoot 项目的配置文件中配置

在 SpringBoot 的 application.properties (或者ymal格式的application.yaml) 中指明日志配置文件

# log4j2
logging.config=classpath:log4j2.xml

2.4 日志配置解析

Appenders

Appenders 中定义了 4 个 Appender,分别对应了 ConsoleFileRandomAccessFileRollingFile 4种类型。

  • Console:控制台输出日志;
  • File: 日志全部输出到一个文件中;
  • RandomAccessFile:参考 RandomAccessFile,RandomAccessFile 总是将日志写入到缓存中,然后再写入到磁盘,并且写入缓存的过程是不能被关掉的,而 FileAppender 中写入缓存的过程是可以被关闭的。若将 immediateFlush 属性设置为 true,那么每写完一条日志到缓存后都会写入到磁盘中;
  • RollingFile:滚动日志,根据日期和日志文件大小滚动;参考 RollingFile;

Loggers

参考:Log4j2 Configuration

  • Root:是根 logger,所有根据类的全路径名定位不到的 logger 都使用 Root 中定义的 Appender 来打印日志;
  • Logger:定义一个具有具体名字的 logger,如 com.foo.Bar,那么在要使用这个 logger 的地方 LogManager.getLogger("com.foo.Bar") 即可得到这个 logger,就可以用这个 logger 下定义的 Appender 来打印日志了;
  • 如果定位不到 logger,则使用 Root 作为默认的 logger。因此,我们可以在 Root 中定义默认的日志配置,如果需要定义某个特定的 logger,采用不同的日志级别,那么就可以单独定义一个logger,在需要的地方用这个 logger 就可以了,十分方便;

&nbsp

Log Format 格式及其说明

Log4j2 – Useful Log Format Pattern

  • -d [%-6p] %c{1} - %m%n
    Using [%-6p], the logging level should be left-justified to a width of six characters. Use it with a pretty printed log level. It will generate the below output:
2016-06-20 19:21:05,271 [DEBUG ] Log4j2HelloWorldExample - Debug Message Logged !!
2016-06-20 19:21:05,272 [INFO  ] Log4j2HelloWorldExample - Info Message Logged !!
  • -d [%-6p] %c{3} - %m%n
    Use %{1} for printing the complete package level. It will generate the below output:
2016-06-20 19:22:05,379 [DEBUG ] com.howtodoinjava.log4j2.examples.Log4j2HelloWorldExample - Debug Message Logged !!
2016-06-20 19:22:05,380 [INFO  ] com.howtodoinjava.log4j2.examples.Log4j2HelloWorldExample - Info Message Logged !!

%{3} will print the package level upto two levels.

2016-06-20 19:23:48,202 [DEBUG ] log4j2.examples.Log4j2HelloWorldExample - Debug Message Logged !!
2016-06-20 19:23:48,204 [INFO  ] log4j2.examples.Log4j2HelloWorldExample - Info Message Logged !!
  • %d{yyyy/MM/dd HH:mm:ss,SSS} [%-6p] %c{1} - %m%n
    Use it for custom date format. It will generate the below output:
2016/06/20 19:24:45,076 [DEBUG ] Log4j2HelloWorldExample - Debug Message Logged !!
2016/06/20 19:24:45,078 [INFO  ] Log4j2HelloWorldExample - Info Message Logged !!

3. 测试

3.1 控制台输出的日志

3.2 日志文件中输出的日志

参考文献

[1] https://logging.apache.org/log4j/2.x/index.html
[2] https://tanzhang.blog.csdn.net/article/details/110723441
[3] https://blog.csdn.net/cxy1991xm/article/details/90549806

【Spring】SpringBoot 配置 log4j2 日志相关推荐

  1. Springboot整合log4j2日志全解

    作者:上帝爱吃苹果 cnblogs.com/keeya/p/10101547.html 在项目推进中,如果说第一件事是搭Spring框架的话,那么第二件事情就是在Sring基础上搭建日志框架,我想很多 ...

  2. spring boot配置logback日志

    spring boot配置logback日志 在上一篇spring boot入门里提过,Spring Boot默认的日志打印是logback,所以配置logback日志会很简单,但是也有注意的地方. ...

  3. spring boot—集成log4j2日志框架

    文章目录 市场上的日志框架 spring boot日志框架关系 移除默认日志框架 切换为log4j2日志框架 市场上的日志框架   1)日志门面最常用的是slf4j   2)日志实现最常用的是logb ...

  4. Springboot配置保存日志文件

    点击关注公众号,利用碎片时间学习 来源:blog.csdn.net/gaopinqiang/ article/details/109228641 springboot日志配置: springboot默 ...

  5. spring boot 中 log4j2 日志无法加载(Feature 'http://apache.org/xml/features/xinclude' is not recognized.)

    Spring boot 1.5.14 版本中使用 log4j2 日志,在 eclipse 中可以打印日志,但是打包成 war 后,直接运行无法将日志输出到日志文件,配置的 log4j2-spring. ...

  6. 如何配置log4j2日志记录至数据库

    log4j2可灵活的将日志打印在控制台.通过SMTP邮件发送.记录至文件.保存至数据库.本文介绍如何配置log4j2将日志记录至数据库 建立用于保存日志的数据库表: CREATE TABLE `sys ...

  7. SpringBoot 2.1.3配置log4j2日志框架完整代码示例

    第一步:pom依赖:需要在spring-boot-starter中进行依赖排除配置,因为spring-boot-starter中默认集成了log4j,两者会有冲突. <dependency> ...

  8. 第十一节:Springboot整合log4j2日志

    SpringBoot默认使用的是logback, 但是还有一个性能更高的日志实现框架log4j2. 为什么选用log4j2 相比与其他的日志系统,log4j2丢数据这种情况少:disruptor技术, ...

  9. SpringBoot配置Logback日志详解

    正文 Spring Boot默认集成了Logback,可以开箱即用,非常方便.因为spring-boot-starter-logging是Logback的日志实现,而Spring Boot启动项spr ...

最新文章

  1. 烂泥:虚拟化KVM安装与配置
  2. php上传视频文件代码,php上传视频的代码
  3. Hadoop-2.8.0集群搭建、hadoop源码编译和安装、host配置、ssh免密登录、hadoop配置文件中的参数配置参数总结、hadoop集群测试,安装过程中的常见错误
  4. SCARA机器人与 DELTA机器人
  5. 牛客16662 津津的储蓄计划
  6. locust mysql_locust性能压测连接mysql,随机取出班级,绑定学生
  7. jeecgboot logback-spring.xml配置不生成新日志文件
  8. 计算机缺失esul.dll,msedgeupdateres_es.dll
  9. 如何将 iPhone 用作 Mac 的相机?
  10. JaveScript简单数据类型(JS知识点归纳二)
  11. CentOS 7 关闭 rpcbind 服务
  12. java-pdf-itext7、itextpdf 生成pdf 文档 定制票据打印
  13. DDR3内存频率标识对应
  14. Netpod Alive网络拓扑图生成、绘制有生命的网络拓扑图工具
  15. 华为奋力前行,以灵活多变的方式突围,成效显著
  16. 海洋环流与海浪数值模式
  17. react开发插件-ES7 React/Redux/GraphQL/React-Native snippets
  18. PTA_数据结构与算法_7-38 寻找大富翁 (25分)
  19. JDK 8 - computeIfAbsent,computeIfPresent,compute
  20. 图片无损压缩工具(报名照片压缩至30Kb以下

热门文章

  1. 从CRUD到自身架构师的蜕变之路?全靠这份:Java中高级核心知识全面解析
  2. 2022-01-18 任何的长相厮守、不离不弃都是术业有专攻的基础。遇见3D MAX只叹恨晚。。。
  3. 基于ZYNQ 7000的1553B总线控制器测试系统的设计与实现
  4. 从法律角度看数据安全,数据销毁很重要
  5. Meter应用中对于中文乱码的主要解决方法(转)
  6. Autofac深入讲解
  7. PDF矢量图片转为EPS格式图片的方法
  8. clCreateBuffer的7种方式的异同、MapBuffer与clCreateBuffer某些方式的区别与联系
  9. JSP 登陆系统 登陆界面/处理界面/成功界面/失败界面/注销界面(无数据库版) 包含源文件分享
  10. UCOSIII任务调度和任务切换