简述:
翻译log4将的文档,每天搬点,慢慢补
1. log4j2的配置加载
- log4j2在启动时会检查"log4j.configurationFile"系统(??),如果配置了文件扩展名,会根据配置的文件扩展名进行加载扩展文件,
- 如果为进行文件扩展名设置,会依次寻找 log4j2-test.yaml(log4j2-test.yml),log4j2-test.json(或log4j2-test.jsn),log4j2-test.xml文件进行加载
- 如果还未找到配置文件,则尝试去掉文件名中的"-test",在依次进行一次加载
- 如果仍为找到配置文件,则启用默认配置,地址为:org.apache.logging.log4j.core.config.DefaultConfiguration.class;在这个默认配置中,输出源为console,输出等级为error;等同于以下配置:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout
pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
2. 为单独的类做一个单独的配置
<!-- 这里的name值为需要单独log的类的全类名,但它并非是指类全名,而是在log4j2中,在类中创建的Logger实例名默认为类全名,所以,这里的name实际上是指Logger实例的name -->
<Logger name="your className" level="info">
<AppenderRef ref="Console" />
</Logger>
但在上述配置中有个问题,即在运行程序时会发现单独配置log的类中的日志会打印两次,原因在于log4j在执行root的配置是会打印一次,在执行单独配置时又会打印一次;这样的默认行为在log4j2的框架中是经过深思熟虑的,但如果需要屏蔽掉多余的打印,可以在Logger标签中加入additivity="false"的属性,完整配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout
pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="Console" />
</Root>
<Logger name="com.xiangpeng.log4j2.Bar" level="info" additivity="false">
<AppenderRef ref="Console" />
</Logger>
</Loggers>
</Configuration>
3. log4j2有自动重载配置文件的功能
如果你程序在服务器上运行,你更改了log4j2的配置文件又不想重启服务器,你可以在log4j2.xml的根标签中配置“monitorInterval“属性,如果该值不为0,则log4j2在启动后没间隔monitorInterval值得秒数会自动重载一次配置,示例如下
<Configuration status="WARN" monitorInterval="30">
......
</Configuration>
4. 每个配置文件必须有一个rootLogger
- 每个配置文件必须有个rootLogger,如果没有rootLogger,系统会自动生成一个rootLogger,自动生成的rootLogger输出级别为ERROR,输出目的地为console;
默认配置与一下配置等价:
<Loggers>
<Root level="error">
<AppenderRef ref="Console" />
</Root>
</Loggers>
- rootLogger与普通Logger的区别有:
- rootLogger没有"name"属性,这就意味着它的作用范围为整个项目
- rootLogger没有"additivity"属性,因为它没有(逻辑意义上的)父属性
5. 关于Filter
log4j2的filter会在以下四种情况下出现
- 作为与Loggers和Appenders同级的元素,它将在日志传入Loggers之前对内容进行过滤;
- 在Logger元素中,filter会过滤指定的事件
- 在Appender元素中。filter可以防止或导致指定事件被appender处理。
- 在AppenderRef 元素中。这些过滤器用于确定日志记录器是否应该调用被引用的Appender。
当然,Filter不只是可以单独配置,也可以使用Filters代替,在Filters中,我们可以配置多个Filter