Log4j 2.x配置详解

Log4j 2.x配置详解

摘要:通过章节的学习轻松自由配置Log4j 2.x


Log4j 2的配置方式有以下4种

  1. 通过XML、JSON、YAML或properties格式编写的配置文件。

  2. 以编程方式,通过创建配置工厂和配置实现。

  3. 以编程方式,通过调用配置接口中公开的api来添加组件默认配置。

  4. 以编程方式,通过调用内部Logger类上的方法

本文主要关注通过配置文件配置Log4j

Log4j 2如何加载配置文件

Log4j能够在初始化期间自动完成配置。当Log4j启动时将按照从最高到最低的方式,找到所有的ConfigurationFactory插件,进行加载。 Log4j包含四个ConfigurationFactory实现:一个用于JSON,一个用于YAML,一个用于properties,,一个用于XML。优先级方式如下:

Log4j将检查“Log4j.configurationFile”系统属性,如果设置,将尝试使用与文件扩展名匹配的ConfigurationFactory加载配置.

如果未设置系统属性,则ConfigurationFactory将在类路径中查找log4j2-test.properties。

如果没有找到这样的文件,则YAML ConfigurationFactory将查找类路径中下log4j2-test.YAML或log4j2-test.yml。

如果没有找到这样的文件,则JSON ConfigurationFactory将查找类路径中下log4j2-test.json或log4j2-test…jsn

如果找不到测试文件,则ConfigurationFactory将查找类路径上的log4j2.properties.

如果没有找到这样的文件,则YAML ConfigurationFactory将查找类路径上的log4j2.YAML或log4j2.yml.

如果没有找到这样的文件,则JSON ConfigurationFactory将查找类路径上的log4j2.json或log4j2.jsn.

如果找不到配置文件,将使用DefaultConfiguration。

默认示例

import com.foo.Bar;
// Import log4j classes.
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
public class MyApp {
// Define a static logger variable so that it references the
// Logger instance named "MyApp".
private static final Logger logger = LogManager.getLogger(MyApp.class);
public static void main(final String... args) {
        // Set up a simple configuration that logs on the console.
        logger.trace("Entering application.");
        Bar bar = new Bar();
        if (!bar.doIt()) {
        	logger.error("Didn't do it.");
        }
        logger.trace("Exiting application.");
	}
}
package com.foo;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
public class Bar {
	static final Logger logger = LogManager.getLogger(Bar.class.getName());
	public boolean doIt() {
        logger.entry();
        logger.error("Did it again!");
        return logger.exit(false);
	}
}

默认配置控制台输出

17:13:01.540 [main] ERROR com.foo.Bar - Did it again!
17:13:01.540 [main] ERROR MyApp - Didn't do it.

默认配置 log4j2.xml


<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>
Loggers>
Configuration>

注意,默认情况下,Log4j将根记录器分配给Level.ERROR

log4j2.xml

默认配置上增加一个新的配置的记录器定义

 <Logger name="com.foo.Bar" level="trace">
        <AppenderRef ref="Console"/>
  Logger>

xml配置如下


<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>
    	 
    <Logger name="com.foo.Bar" level="trace">
        <AppenderRef ref="Console"/>
    Logger>
        
    <Root level="error">
        <AppenderRef ref="Console"/>
    Root>	
Loggers>
Configuration>

控制台输出

17:13:01.540 [main] TRACE com.foo.Bar - entry
17:13:01.540 [main] TRACE com.foo.Bar - entry
17:13:01.540 [main] ERROR com.foo.Bar - Did it again!
17:13:01.540 [main] TRACE com.foo.Bar - exit (false)
17:13:01.540 [main] TRACE com.foo.Bar - exit (false)
17:13:01.540 [main] ERROR MyApp - Didn't do it.

自动重载配置


<Configuration monitorInterval="30">
...
Configuration>

Chainsaw可以自动处理日志文件(Advertising appender configurations)

Log4j提供了一个“多播”方式的Advertiser 实现,它对appender进行IP多播的方式通过JmDns library配置。

Chainsaw目前只支持FileAppender 广播方式。

Advertising appender 配置

  1. 应用classpath添加 JmDns library ,library官网 http://jmdns.sourceforge.net

  2. “‘advertiser’”属性设置为“multicastdns”

  3. “advertise”属性设置为“true”

  4. 如果发布基于FileAppender的配置,请在将元素附加到适当的URI

例如,可以通过 sftp://URI,http://URI ,file:// URI


<Configuration advertiser="multicastdns">
...
Configuration>
<Appenders>
File>
Appenders>

配置语法

从版本2.9开始,出于安全原因,Log4j不处理XML文件中的DTD。如果你想拆分多个文件中的配置,使用XInclude或Composite配置。Log4j允许您轻松地重新定义无需修改应用程序即可记录行为。可以禁用应用程序某些部分的日志记录,只需要设置特定条件。例如为特定用户执行,将输出路由到Flume或日志报告系统.轻松定义的前提条件是要理解配置文件的语法。XML文件中的配置元素接受几个属性:

Attribute Name Description
advertiser The Advertiser plugin name which will be used to advertise individual FileAppender or SocketAppender configurations. The only Advertiser plugin provided is 'multicastdns".
dest Either “err” for stderr, “out” for stdout, a file path, or a URL.
monitorInterval The minimum amount of time, in seconds, that must elapse before the file configuration is checked for changes.
name The name of the configuration
packages A comma separated list of package names to search for plugins. Plugins are only loaded once per classloader so changing this value may not have any effect upon reconfiguration
schema Identifies the location for the classloader to located the XML Schema to use to validate the configuration. Only valid when strict is set to true. If not set no schema validation will take place.
shutdownHook Specifies whether or not Log4j should automatically shutdown when the JVM shuts down. The shutdown hook is enabled by default but may be disabled by setting this attribute to “disable”
shutdownTimeout Specifies how many milliseconds appenders and background tasks will get to shutdown when the JVM shuts down. Default is zero which mean that each appender uses its default timeout, and don’t wait for background tasks. Not all appenders will honor this, it is a hint and not an absolute guarantee that the shutdown procedure will not take longer. Setting this too low increase the risk of losing outstanding log events not yet written to the final destination. See LoggerContext.stop(long, java.util.concurrent.TimeUnit). (Not used if shutdownHook is set to “disable”.)
status The level of internal Log4j events that should be logged to the console. Valid values for this attribute are “trace”, “debug”, “info”, “warn”, “error” and “fatal”. Log4j will log details about initialization, rollover and other internal actions to the status logger. Setting status=“trace” is one of the first tools available to you if you need to troubleshoot log4j.
strict Enables the use of the strict XML format. Not supported in JSON configurations.
verbose Enables diagnostic information while loading plugins.

完整XML配置如下

;
<Configuration>
  <Properties>
    <Property name="name1">valueproperty>
    <Property name="name2" value="value2"/>
  Properties>
  <filter  ... />
  <Appenders>
    <appender ... >
      <filter  ... />
    appender>
    ...
  Appenders>
  <Loggers>
    <Logger name="name1">
      <filter  ... />
    Logger>
    ...
    <Root level="level">
      <AppenderRef ref="name"/>
    Root>
  Loggers>
Configuration>

Appenders

Appenders负责将日志事件传递到其目标。每个Appenders必须实现Appender接口。大多数appender将扩展AbstractAppender添加生命周期和可筛选支持。生命周期允许组件在配置已完成并在关机期间执行清理。可过滤允许组件上附加了在事件处理期间评估的筛选器。

Appenders通常只负责将事件数据写入目标 。在大多数情况下案例将格式化事件的责任委托给布局。一些Appenders包裹另一个Appenders程序,以便它们可以修改LogEvent、处理Appenders程序中的故障、将事件路由到基于高级筛选条件或提供类似功能的从属Appenders程序直接格式化事件以供查看。

常见的Appender

本地存储 FileAppender,RollingFileAppender,RollingRandomAccessFileAppender

控制台存储:ConsoleAppender

远程存储:FlumeAppender, KafkaAppender

AsyncAppender

默认情况下,AsyncAppender使用java.util.concurrent.ArrayBlockingQueue,不需要任何外部库 。

请注意,多线程应用程序在使用这样的附加程序:阻塞队列易受锁争用的影响,我们的测试显示当更多线程同时记录时,性能可能会变得更差。考虑使用无锁异步记录器以获得最佳性能。

结束语

Log4J2 日志打印,经过架构的分析,我们得出要理解的地方是:配置文件的加载顺序是什么,配置文件的配置就是告诉记录器,什么级别的日志可以输出,输出的目标是哪里,数据格式是什么样的,输出的方式是同步还是异步,输出的类型是什么,文件输出还是远程输出,还是控制台输出。log4j2 关键配置元素: Configuration 代表根节点, Loggers 代表记录器的根节点,一个配置可以有多个记录器,每个记录可以配置不同的日志级别。Loggers的子节点Logger和 Root,Root 是Loggers 根记录器,是系统的默认记录器,Logger是用户自定义的记录器。 AppenderRef 表示告诉记录器使用哪个 Appender。


更多log4j2的知识,请参阅官网英文文献 https://logging.apache.org/log4j/2.x/articles.html ,作者会继续更新log4j2的知识。

大数据时代日志数据很重要,因为我们的大部分数据都来源日志数据,而非业务数据。

如果觉得文章有帮助,关注下作者的公众号,赞个人气,不胜感激!
同时可以下载作者整理的工作10多年来阅读过的电子书籍。
公众号: TalkNewClass
Log4j 2.x配置详解_第1张图片

你可能感兴趣的:(日志框架,log4j2)