Log4j2的配置

简述:

翻译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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值