http://logging.apache.org/log4j/2.x/faq.html#separate_log_files
How do I reconfigure log4j2 in code with a specific configuration file?
See the below example. Be aware that this LoggerContext class is not part of the public API so your code may break with any minor release.
- // import org.apache.logging.log4j.core.LoggerContext;
- LoggerContext context = (org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false);
- File file = new File("path/to/a/different/log4j2.xml");
- // this will force a reconfiguration
- context.setConfigLocation(file.toURI());
<?xml version="1.0" encoding="UTF-8"?> <Configuration> status="debug" monitorInterval="1800" <properties> <property name="LOG_HOME">E://stats_collector_logs</property> <!-- 日志備份目錄 --> <property name="BACKUP_HOME">{LOG_HOME}/backup</property> <property name="STAT_NAME">log</property> </properties> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%m%n"/> </Console> <File name="MyFile" fileName="/stats"> <PatternLayout pattern="- %msg%n" /> </File> <!-- STB發來的播放日志 --> <RollingRandomAccessFile name="playLogAppender" fileName="${LOG_HOME}/play_${STAT_NAME}_" filePattern="${LOG_HOME}/play_${STAT_NAME}_%d{yyyy_MM_dd_HH_mm}.log"> <PatternLayout pattern="%msg%n" /> <Policies> <TimeBasedTriggeringPolicy interval="1" modulate="true" /> </Policies> </RollingRandomAccessFile> <!-- STB發來的播放日志 --> <RollingRandomAccessFile name="viewLogAppender" fileName="${LOG_HOME}/view_${STAT_NAME}_" filePattern="${LOG_HOME}/view_${STAT_NAME}_%d{yyyy_MM_dd_HH_mm}.log"> <PatternLayout pattern="%msg%n" /> <Policies> <TimeBasedTriggeringPolicy interval="1" modulate="true" /> </Policies> </RollingRandomAccessFile> <!--interval,integer型,指定兩次封存動作之間的時間間隔。單位:以日志的命名精度來確定單位,比如yyyy-MM-dd-HH 單位為小時,yyyy-MM-dd-HH-mm 單位為分鍾--> <!--modulate,boolean型,說明是否對封存時間進行調制。若modulate=true,則封存時間將以0點為邊界進行偏移計算。比如,modulate=true,interval=4hours,那么假設上次封存日志的時間為03:00,則下次封存日志的時間為04:00,之后的封存時間依次為08:00,12:00,16:00,。。。--> <!-- 程序員調試日志 --> <RollingRandomAccessFile name="DevLog" fileName="${LOG_HOME}/${SERVER_NAME}" filePattern="${LOG_HOME}/${SERVER_NAME}.%d{yyyy-MM-dd-HH}.log"> <PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" /> <Policies> <TimeBasedTriggeringPolicy interval="1" modulate="true" /> </Policies> </RollingRandomAccessFile> <!-- 游戲產品數據分析日志 --> <RollingRandomAccessFile name="ProductLog" fileName="${LOG_HOME}/${SERVER_NAME}_${STAT_NAME}" filePattern="${LOG_HOME}/${SERVER_NAME}_${STAT_NAME}.%d{yyyy-MM-dd-HH}.log"> <PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" /> <Policies> <TimeBasedTriggeringPolicy interval="1" modulate="true" /> </Policies> </RollingRandomAccessFile> <!--文件會打印出所有信息,這個log每次運行程序會自動清空,由append屬性決定,這個也挺有用的,適合臨時測試用--> <File name="log" fileName="log/test.log" append="false"> <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/> </File> <!--這個會打印出所有的信息,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的文件夾下面並進行壓縮,作為存檔--> <RollingFile name="RollingFile" fileName="logs/app.log" filePattern="log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz"> <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/> <SizeBasedTriggeringPolicy size="50MB"/> </RollingFile> <File name="ERROR" fileName="logs/error.log"> <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/> </File> </Appenders> <Loggers> <Logger name="PLAY_LOG" level="trace" additivity="false"> <AppenderRef ref="playLogAppender" /> </Logger> <Logger name="VIEW_LOG" level="trace" additivity="false"> <AppenderRef ref="viewLogAppender" /> </Logger> <Root level="debug"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration>