type
status
date
slug
summary
tags
category
icon
password
一、Log4j2集成
1、引入依赖
以 Maven 依赖为例,下面三种方式三选一即可。
- 引入核心包
log4j-api.jar
和log4j-core.jar
。
注意2.17.1以下的版本会有远程代码执行的安全漏洞,具体参考Apache官方文档(https://logging.apache.org/log4j/2.x/security.html)。推荐使用最新的版本。
- 如果需要接入 Slf4j,直接引入
log4j-slf4j-impl.jar
依赖即可,其中除了包含两个 API 之间的桥梁,还包含上面的两个核心包。
- 如果使用 Spring Boot 项目,可以直接使用
spring-boot-starter-log4j2
,但是需要先排除默认的logback
。
2、创建配置文件
新建
log4j2.xml
配置文件,并放到项目的 classpath 里面,一般会放到 resources 目录里面。下面是一个参考的配置,当然也可以使用 properties 文件和 yaml 文件来进行配置。下面是一个最简配置。3、在程序中打印日志
输出如下:
二、Log4j2配置文件加载
Log4j2 包含 4 种 ConfigurationFactory 的实现,分别适用于 JSON、YAML、properties 和 XML 配置文件。所有元素和属性名均不区分大小写。但推荐标签首字母大写,属性小写。
配置文件的加载顺序如下:
- log4j将检查
log4j.configuration file
系统属性,如果设置了,将尝试使用与文件扩展名匹配的configurationfactory 加载配置。
- 如果未设置系统属性,则属性配置工厂将在类路径中查找
log4j2-test.properties
。
- 如果没有找到这样的文件,yaml 配置工厂 将在类路径中查找
log4j2-test.yaml
或log4j2-test.yml
。
- 如果找不到这样的文件,json 配置工厂将在类路径中查找
log4j2-test.json
或log4j2-test.jsn
。
- 如果找不到这样的文件,XML 配置工厂将在类路径中查找
log4j2-test.xml
。
- 如果找不到测试文件,properties 配置工厂将在类路径上查找
log4j2.properties
。
- 如果找不到属性文件,yaml 配置工厂将在类路径上查找
log4j2.yaml
或log4j2.yml
。
- 如果找不到 yaml文 件,json 配置工厂将在类路径上查找
log4j2.json
或log4j2.jsn
。
- 如果找不到 JSON 文件,XML 配置工厂将尝试在类路径上找到
log4j2.xml
。
- 如果找不到配置文件,将使用默认配置
DefaultConfiguration
,默认配置等同下面的配置(这也就是为什么控制台没有 info 级别以下日志输出的原因)
我们一般默认使用
log4j2.xml
进行命名。如果本地要测试,可以把 log4j2-test.xml 放到 classpath,而正式环境使用 log4j2.xml。在打包部署的时候不要打包 log4j2-test.xml 即可。我们可以在配置文件application.yml
通过下面方式修改日志级别,就是因为 Log4j2 支持 JSON 格式。
Log4j 可以使用两种 XML 格式:简明和严格。简明格式可以简化配置,元素名匹配其代表的组件,但不能通过 XML Schema 来验证。例如
和
是等价的。根据上面的介绍就可以理解下面所示的 XML 配置结构。其中,小写字母开头的元素为简明格式。
三、配置文件解析
一个经典的
log4j2.xml
的配置结构如下图所示Configuration
Configuration 是根结点,常用属性是 status 和 monitorinterval
属性 | 作用 |
status | 用来指定log4j本身的打印日志的级别。共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF。
• All:最低等级的,用于打开所有日志记录。
• Trace:是追踪,就是程序推进以下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低日志级别不让他输出。
• Debug:指出细粒度信息事件对调试应用程序是非常有帮助的。
• Info:消息在粗粒度级别上突出强调应用程序的运行过程。
• Warn:输出警告及warn以下级别的日志。
• Error:输出错误信息日志。
• Fatal;输出每个严重的错误事件将会导致应用程序的退出的日志。
• OFF:最高等级的,用于关闭所有日志记录。 |
monitorinterval | 用于指定 log4j 自动重新配置的监测间隔时间,单位是 s,最小是5s。 |
Properties
Log4j2支持在配置中定义全局属性,name属性必须存在且唯一,允许使用${name}来引用该变量。
例如:以下配置定了LOG_HOME的全局属性
要使用该属性,需要使用
${LOG_HOME}
来引用
Appenders
Appenders
负责将日志传送至配置目的地,配置日志打印内容、格式、方式、保存策略等。下面的节点都必须有 name 属性,且该 name 值唯一,该 name 将在 Logger
标签中被使用。Console
用来定义输出到控制台的Appender。
属性 | 作用 |
name | 必填,指定Appender的名字。 |
target | SYSTEM_OUT 或 SYSTEM_ERR,一般只设置默认: SYSTEM_OUT 。 |
ThresholdFilter | 决定日志事件能否被输出。过滤条件有三个值: ACCEPT(接受) ,DENY(拒绝) ,NEUTRAL(中立) 。ACCEPT 和 DENY 之后,后续的过滤器就不会执行了,只有在 NEUTRAL 的时候才会执行后续的过滤器。
onMatch="ACCEPT"匹配该级别及以上级别
onMatch="DENY"不匹配该级别及以上级别
onMismatch="ACCEPT" 表示匹配该级别以下的级别
onMismatch="DENY" 表示不匹配该级别以下的级别
匹配INFO级别以及以上级别,不匹配INFO级别以下级别,即: 匹配 >= INFO的级别
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
不匹配WARN级别以及以上级别,匹配WARN级别以下级别,即: 匹配 < WARN的级别
<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="ACCEPT"/>
不匹配ERROR级别及以上级别,然后走下一个过滤器,匹配DEBUG级别以及以上级别,所以匹配 >= DEBUG & < EROOR 的级别,即使匹配DEBUG和INFO级别
<ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/> |
PatternLayout | 输出格式,不设置默认为 %m%n 。PatternLayout 可以使用与C语言printf函数类似的转换模式来指定输出格式。常见的配置如下:
• %d{yyyy-MM-dd HH:mm:ss.SSS} : 日志生成时间,输出格式为“年-月-日 时:分:秒.毫秒”
• %p : 日志输出格式
• %c : logger的名称
• %m : 日志内容,即 logger.info("message")
• %n : 换行符
• %T : 线程号
• %L : 日志输出所在行数
• %M : 日志输出所在方法名 |
File
用来定义输出到指定位置的文件的Appender。比较少用。
属性 | 作用 |
name | 指定Appender的名字。 |
fileName | 指定输出日志的目的文件带全路径的文件名。 |
PatternLayout | 输出格式,不设置默认为 %m%n 。 |
RollingFile
用来定义超过指定大小自动删除旧的创建新的的Appender。
- 其支持缓存并可设置缓存大小,默认开启,记录首先会写入缓冲区,当缓冲区满再写入磁盘,性能显著提高
- 支持文件滚动更新,当文件的大小或时间满足一定条件,可自动将日志写入新的文件
属性 | 作用 |
name | 指定Appender的名字。 |
fileName | 指定输出日志的目的文件带全路径的文件名。 |
filePattern | 指定新建日志文件的名称格式。 |
PatternLayout | 输出格式,不设置默认为 %m%n 。 |
Policies | 是指定滚动日志的策略,就是什么时候进行新建日志文件输出日志。有两种策略
• TimeBasedTriggeringPolicy :基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am...而不是7am。
• SizeBasedTriggeringPolicy :基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小。 |
DefaultRolloverStrategy | 用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性)。 |
RollingRandomAccessFile
RollingRandomAccessFileAppender 与 RollingFileAppender 相似,除了它会被缓存且在内部它使用 ByteBuffer + RandomAccessFile 而不是 BufferedOutputStream。与 RollingFileAppender 相比,性能提高了20-200%。
Loggers
日志打印配置,只有此处配置了Appender,Appender才会生效。
Root
用来指定项目的根日志,如果没有单独指定 Logger,那么就会默认使用该 Root 日志输出
属性 | 作用 |
level | 日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF。 |
AppenderRef | Root 的子节点,用来指定该日志输出到哪个 Appender。 |
Logger
用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。
属性 | 作用 |
name | 用来指定该 Logger 所适用的类或者类所在的包全路径,继承自Root节点 |
level | 非必填,日志输出级别,默认ERROR。共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF。 |
additivity | 非必填,默认true。该 Logger 是否附加给Root |
AppenderRef | Logger 的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root。如果指定了,那么会在指定的这个 Appender 和 Root 的 Appender 中都会输出,此时我们可以设置 Logger 的 additivity="false" 只在自定义的 Appender 中进行输出。 |
四、配置文件示例
- Author:mcbilla
- URL:http://mcbilla.com/article/520bc254-8843-467a-9f85-ccd6bd1d7460
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!