Zhou Study hard, improve every day.

log4j使用整理

2021-07-22
本文 5211 字,阅读全文约需 15 分钟

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.*版本)

转自以下位置

csdn

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。

  1. Log4j 将检查“log4j2.configurationFile”系统属性,如果设置,将尝试使用与文件扩展名匹配的 ConfigurationFactory 加载配置。请注意,这不限于本地文件系统上的某个位置,并且可能包含一个 URL。
  2. 如果未设置系统属性,则属性 ConfigurationFactory 将在类路径中查找 log4j2-test.properties。
  3. 如果未找到此类文件,YAML ConfigurationFactory 将在类路径中查找 log4j2-test.yaml 或 log4j2-test.yml。
  4. 如果没有找到这样的文件,JSON ConfigurationFactory 将在类路径中查找 log4j2-test.json 或 log4j2-test.jsn。
  5. 如果没有找到这样的文件,XML ConfigurationFactory 将在类路径中查找 log4j2-test.xml。
  6. 如果无法找到测试文件,则属性 ConfigurationFactory 将在类路径上查找 log4j2.properties。
  7. 如果无法找到属性文件,YAML ConfigurationFactory 将在类路径上查找 log4j2.yaml 或 log4j2.yml。
  8. 如果找不到 YAML 文件,JSON ConfigurationFactory 将在类路径上查找 log4j2.json 或 log4j2.jsn。
  9. 如果找不到 JSON 文件,XML ConfigurationFactory 将尝试在类路径上定位 log4j2.xml。
  10. 如果找不到配置文件,则将使用 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:最高等级的,用于关闭所有日志记录.

​ 程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少。


Comments

Content