一、核心概念
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的用法,希望对大家有所帮助。