升级日志系统 log4j2 干货整理

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

 

 

 

三,使用。

  1. 采用java 指定xml配置文件初始化log4j2
  2. 开启 monitorInterval 便于生产修改日志级别,等。
  3. 初始化前 使用 ${main:0:-} 动态指定日志文件名。
  4. 开启异步日志后 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>

 

上一篇:一行配置搞定 Spring Boot项目的 log4j2 核弹漏洞!


下一篇:如何定义多个日志输出文件