一、核心概念
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的用法,希望對大家有所幫助。
原創文章,作者:TWRKO,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/330493.html