最新升級日志系統,
閱讀官方文檔 https://logging.apache.org/log4j/2.x/index.html
參考了一些百度資料,整理一些使用技巧 干貨記錄
目前流行應用化,服務化,所以未做web上調試。
**需求,指定log4j2的配置文件啟動, 修改某些Appender, 一份log4j2配置文件 多應用使用變更日志文件。**
一,java代碼指定配置文件有幾種方式
方式一:需要在所有 logger申明前處理
ConfigurationSource source = new ConfigurationSource(new FileInputStream(path));
Configurator.initialize(null, source);
方式二:推薦使用 沒有方式一不生效的問題
LoggerContext context=(LoggerContext)LogManager.getContext(false);
context.setConfigLocation(new File(path).toURI());//這將強制重新配置
二,程序初始時指定 Appender的日志文件
初始化前設置變量名, 配置文件使用 ${main:0:-} 0為參數下標 -后接默認值
MainMapLookup.setMainArguments(String.valueOf(port));
<property name="API_NAME">${main:0:-}name</property>
其他方式 重context中獲取 在修改,不建議使用。 使用后 monitorInterval監測配置的功能估計 用不了。
Configuration config=context.getConfiguration(); if (config.getAppender("API") != null) { RollingRandomAccessFileAppender rollingFileAppender = (RollingRandomAccessFileAppender)config.getAppender("API"); rollingFileAppender.stop(); config.getLoggers().forEach((key,value)->{value.removeAppender("API"); });//從logger 中移除 RollingRandomAccessFileAppender appender = RollingRandomAccessFileAppender.newBuilder() .setName("API") .withFileName (rollingFileAppender.getFileName().replace("name.log","name"+port+".log")) .withFilePattern(rollingFileAppender.getFilePattern().replace("name-","name"+port+"-")) .withPolicy(rollingFileAppender.getManager().getTriggeringPolicy()) .setLayout(rollingFileAppender.getLayout()) .build(); appender.start(); //重新加入logger config.getLoggers().forEach((key,value)->{ value.addAppender(appender, config.getRootLogger().getLevel(), null); }); context.updateLoggers(config); }
三,使用。
- 采用java 指定xml配置文件初始化log4j2
- 開啟 monitorInterval 便於生產修改日志級別,等。
- 初始化前 使用 ${main:0:-} 動態指定日志文件名。
- 開啟異步日志后 includeLocation 設置false 性能會好很多。 需要時再修改配置文件 通過monitorInterval 來生效
<?xml version="1.0" encoding="UTF-8"?> <!-- # 1. DEBUG 2. INFO 3. WARN 4. ERROR 5. FATAL (the most serious) --> <Configuration status="WARN" monitorInterval="60" > <properties> <property name="LOG_HOME">/data/xxxx/logs</property> <property name="API_NAME">${main:0:-}xxx</property> </properties> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%date{HH:mm:ss.SSS} [%thread] %level %logger:%line %msg%n" /> </Console> <RollingRandomAccessFile name="API" fileName="${LOG_HOME}/${API_NAME}.log" filePattern="${LOG_HOME}/${API_NAME}-%d{yyyy-MM-dd}-%i.log.gz"> <PatternLayout pattern="%date{HH:mm:ss.SSS} [%thread] %level %logger:%line %msg%n" /> <Policies> <TimeBasedTriggeringPolicy modulate="true" interval="1"/> </Policies> <DefaultRolloverStrategy max="20" /> </RollingRandomAccessFile> </Appenders> <Loggers> <AsyncRoot level="DEBUG" ><!-- includeLocation="true" 慢 30-100倍 --> <AppenderRef ref="Console" /> <AppenderRef ref="API" /> </AsyncRoot> <Logger name="org.apache.http" level="info" additivity="false"> <AppenderRef ref="API" /> </Logger> </Loggers> </Configuration>