您的位置:

log4j-core2.17.1详解

一、核心概念

log4j是一个灵活的、快速的、多种日志输出的Java日志库。log4j-core是log4j库的核心模块,它包含了Logger、Appender、Layout等核心概念和实现方式。Logger是log4j中最核心的概念之一,用于控制日志输出级别和日志输出的目的地。Appender用于指定日志输出的目的地,可以是控制台、文件、数据库等等。Layout用于定义日志消息的布局,例如可以格式化输出时间、类名、方法名等等信息。

二、Logger

Logger是log4j中最核心的概念之一,它用于控制日志输出级别和日志输出的目的地。Logger是根据类名获取的,可以通过如下方式获取Logger实例:

private static final Logger logger = LogManager.getLogger(MyClass.class);

然后可以通过设置日志输出级别和输出目的地来控制日志输出。例如,可以使用如下方式设置日志输出级别为DEBUG:

logger.setLevel(Level.DEBUG);

还可以设置输出目的地。例如,可以使用如下方式设置输出到控制台:

ConsoleAppender consoleAppender = new ConsoleAppender();
consoleAppender.setThreshold(Level.DEBUG);
consoleAppender.setLayout(new PatternLayout("%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %m%n"));
logger.addAppender(consoleAppender);

此时,logger输出的日志将同时输出到文件和控制台。如果需要只输出到文件或者只输出到控制台,可以按照需求选择Appender并添加到logger中。

三、Appender

Appender用于指定日志输出的目的地,可以是控制台、文件、数据库等等。log4j-core提供了多种Appender,可以根据需求选择对应的Appender。例如,ConsoleAppender用于输出到控制台,FileAppender用于输出到文件,JDBCAppender用于输出到数据库。

我们已经演示了如何将日志同时输出到文件和控制台,这里再演示如何将日志输出到文件。例如,可以使用如下方式设置输出到文件:

FileAppender fileAppender = new FileAppender();
fileAppender.setFile("example.log");
fileAppender.setThreshold(Level.DEBUG);
fileAppender.setLayout(new PatternLayout("%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %m%n"));
logger.addAppender(fileAppender);

此时,logger输出的日志将同时输出到文件和控制台。如果需要只输出到文件或者只输出到控制台,可以按照需求选择Appender并添加到logger中。

四、Layout

Layout用于定义日志消息的布局,例如可以格式化输出时间、类名、方法名等等信息。log4j-core提供了多种Layout,可以根据需求选择对应的Layout。例如,PatternLayout用于定义输出格式为指定的格式字符串。

我们已经演示了如何在Appender中使用PatternLayout设置日志消息的布局,这里再演示一个更加简单的方法,在Logger中直接设置输出格式。例如,可以使用如下方式设置输出格式为指定的格式字符串:

LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false);
Configuration configuration = loggerContext.getConfiguration();
LoggerConfig loggerConfig = configuration.getLoggerConfig(LogManager.ROOT_LOGGER_NAME);
loggerConfig.removeAppenders();
loggerConfig.getAppenderRefs().forEach(appenderRef -> {
    String appenderName = appenderRef.getRef();
    Appender appender = configuration.getAppender(appenderName);
    appender.stop();
    loggerConfig.removeAppender(appenderName);
});
ConsoleAppender consoleAppender = ConsoleAppender.createDefaultAppender();
consoleAppender.start();
LoggerConfig rootLoggerConfig = loggerContext.getRootLogger();
rootLoggerConfig.addAppender(consoleAppender, Level.ALL, null);
rootLoggerConfig.setLevel(Level.ALL);
ConfigurationScheduler scheduler = loggerContext.getConfigurationScheduler();
scheduler.start();

此时,logger输出的日志将按照指定的格式字符串输出,格式字符串可以包含如下占位符:

%d:输出时间,例如yyyy-MM-dd HH:mm:ss.SSS

%c:输出Logger的名称,例如com.example.MyClass

%t:输出当前线程的名称,例如main

%L:输出当前日志输出语句在代码中的行号,例如42

%m:输出日志消息,例如Hello, World!

五、性能优化

log4j-core具有很高的性能,但是在某些情况下可能会出现性能问题。例如,如果在多线程环境中使用log4j,可能会出现性能瓶颈。此时可以考虑使用异步Appender来解决性能问题。异步Appender会将日志消息放入内存队列中,然后交给单独的线程异步地将日志消息输出到目的地,从而避免在主线程中阻塞。

可以使用如下方式创建异步Appender:

AsyncAppender asyncAppender = AsyncAppender.newBuilder()
    .setAppender(fileAppender)
    .setBufferSize(1024 * 1024)
    .build();
logger.addAppender(asyncAppender);

其中,setAppender用于指定原始的Appender,这里选择的是FileAppender;setBufferSize用于指定内存队列的大小,单位为字节,默认值为256KB。可以根据实际情况调整内存队列的大小。

六、总结

log4j-core是一个灵活的、快速的、多种日志输出的Java日志库的核心模块,本文从Logger、Appender、Layout、性能优化等多个方面进行了详细的阐述,并演示了多种log4j-core的用法,希望对大家有所帮助。