最新升级日志系统,
阅读官方文档 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>