log4j使用整理
1.简介
Apache Log4j是一个基于Java的日志记录工具。它是由Ceki Gülcü首创的,现在则是Apache软件基金会的一个项目。 log4j是几种Java日志框架之一。
Gülcü此后开创了SLF4J和Logback 项目,意图成为log4j的继任者。
log4j团队创建了log4j的继任者,版本号为2.0的新版本。log4j 2.0着重于log4j 1.2、1.3、java.util.logging和logback中的问题,并解决这些框架中的架构问题。此外,log4j 2.0提供了一个插件架构,这使得其更可扩展。log4j 2.0不是与1.x向后兼容的版本[2],虽然有一个“适配器”可用。
log4j目前最新版本是2.14.1
。但我似乎一直使用的1.*
,因此本文档准备写两部分,即1.*
的使用、2.*
的使用。
先完成2.*的文档。
2.基础使用(2.*版本)
转自以下位置
2.1maven导包
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.14.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.14.1</version>
</dependency>
</dependencies>
Log4j 具有在初始化期间自动配置自身的能力。当 Log4j 启动时,它会定位所有 ConfigurationFactory 插件,并按从高到低的加权顺序排列它们。交付时,Log4j 包含四种 ConfigurationFactory 实现:一种用于 JSON,一种用于 YAML,一种用于属性,一种用于 XML。
- Log4j 将检查“log4j2.configurationFile”系统属性,如果设置,将尝试使用与文件扩展名匹配的 ConfigurationFactory 加载配置。请注意,这不限于本地文件系统上的某个位置,并且可能包含一个 URL。
- 如果未设置系统属性,则属性 ConfigurationFactory 将在类路径中查找 log4j2-test.properties。
- 如果未找到此类文件,YAML ConfigurationFactory 将在类路径中查找 log4j2-test.yaml 或 log4j2-test.yml。
- 如果没有找到这样的文件,JSON ConfigurationFactory 将在类路径中查找 log4j2-test.json 或 log4j2-test.jsn。
- 如果没有找到这样的文件,XML ConfigurationFactory 将在类路径中查找 log4j2-test.xml。
- 如果无法找到测试文件,则属性 ConfigurationFactory 将在类路径上查找 log4j2.properties。
- 如果无法找到属性文件,YAML ConfigurationFactory 将在类路径上查找 log4j2.yaml 或 log4j2.yml。
- 如果找不到 YAML 文件,JSON ConfigurationFactory 将在类路径上查找 log4j2.json 或 log4j2.jsn。
- 如果找不到 JSON 文件,XML ConfigurationFactory 将尝试在类路径上定位 log4j2.xml。
- 如果找不到配置文件,则将使用 DefaultConfiguration。这将导致日志输出进入控制台。
2.2配置文件
新建log4j2.xml
我们一般默认使用log4j2.xml进行命名。如果本地要测试,可以把log4j2-test.xml放到classpath,而正式环境使用log4j2.xml,则在打包部署的时候不要打包log4j2-test.xml即可。
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="error">
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</Console>
<File name="log" fileName="target/test.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>
<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
<SizeBasedTriggeringPolicy size="500 MB" />
</RollingFile>
</appenders>
<loggers>
<root level="trace">
<appender-ref ref="RollingFile"/>
<appender-ref ref="Console"/>
</root>
</loggers>
</configuration>
Attribute Name | Description |
---|---|
dest | “err”表示stderr,“out”表示stdout,文件路径或URL。 |
monitorInterval | 在对文件配置进行更改检查之前必须经过的最短时间,以秒为单位。 |
name | 配置的名称。 |
packages | 一个用逗号分隔的包名列表,用于搜索插件。每个类加载器只加载一次插件,所以更改这个值可能对重新配置没有任何影响。 |
status | 应该记录到控制台的内部Log4j事件级别。此属性的有效值为”trace”、”debug”、”info”、”warn”、”error”和”fatal”。Log4j将把关于初始化、翻转和其他内部操作的详细信息记录到状态记录器中。如果您需要对log4j进行故障排除,设置status=”trace”是可用的第一个工具。(或者,设置系统属性Log4j2 .debug也会将内部Log4j2日志打印到控制台,包括在找到配置文件之前发生的内部日志。) |
配置文件节点解析
(1)根节点Configuration有两个属性:status和monitorinterval,有两个子节点:Appenders和Loggers(表明可以定义多个Appender和Logger).
- status用来指定log4j本身的打印日志的级别.
- monitorinterval用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s.
(2)Appenders节点,常见的有三种子节点:Console、RollingFile、File.
-
Console
节点用来定义输出到控制台的Appender.
-
name:指定Appender的名字.
-
target:SYSTEM_OUT 或 SYSTEM_ERR,一般只设置默认:SYSTEM_OUT.
-
PatternLayout:输出格式,不设置默认为:%m%n.
-
-
File
节点用来定义输出到指定位置的文件的Appender.
-
name:指定Appender的名字.
-
fileName:指定输出日志的目的文件带全路径的文件名.
-
PatternLayout:输出格式,不设置默认为:%m%n.
-
-
RollingFile
节点用来定义超过指定大小自动删除旧的创建新的的Appender.
- name:指定Appender的名字.
- fileName:指定输出日志的目的文件带全路径的文件名.
- PatternLayout:输出格式,不设置默认为:%m%n.
- filePattern:指定新建日志文件的名称格式.
- Policies:指定滚动日志的策略,就是什么时候进行新建日志文件输出日志.
- TimeBasedTriggeringPolicy:Policies子节点,基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am…而不是7am.
- SizeBasedTriggeringPolicy:Policies子节点,基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小.
- DefaultRolloverStrategy:用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性)。
(3)Loggers节点,常见的有两种:Root和Logger.
-
Root
节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出
-
level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
-
AppenderRef:Root的子节点,用来指定该日志输出到哪个Appender.
-
-
Logger
节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。
- level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
- name:用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点.
- AppenderRef:Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root.如果指定了,那么会在指定的这个Appender和Root的Appender中都会输出,此时我们可以设置Logger的additivity=”false”只在自定义的Appender中进行输出。
(4)关于日志level.
共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
- All:最低等级的,用于打开所有日志记录.
- Trace:是追踪,就是程序推进以下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低日志级别不让他输出.
- Debug:指出细粒度信息事件对调试应用程序是非常有帮助的.
- Info:消息在粗粒度级别上突出强调应用程序的运行过程.
- Warn:输出警告及warn以下级别的日志.
- Error:输出错误信息日志.
- Fatal:输出每个严重的错误事件将会导致应用程序的退出的日志.
- OFF:最高等级的,用于关闭所有日志记录.
程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少。