动态配置log4j2.xml日志输出文件的位置

目标:根据启动jar时传进main()的参数动态修改日志位置

一、修改启动项 

MainMapLookup.setMainArguments(args);
注:不要在lookup设置之前初始化log(如:
private static final Logger log = LoggerFactory.getLogger(HttpServer.class);)
 1   public static void main(String[] args) throws InterruptedException, ServletException {
 2         // 设置log文件夹
 3         MainMapLookup.setMainArguments(args);
 4 
 5         // 读配置文件并启动
 6         try {
 7             String confPathName = args[0];
 8             // 读取jar外的配置文件
 9             InputStream in = new BufferedInputStream(new FileInputStream(confPathName+ "/conf.properties"));
10             config.load(in);
11         } catch (Exception e) {
12             e.printStackTrace();
13         }
14         new HttpServer().start();
15     }

二、设置log4j2.xml

  ${main:0}

  

lo4j2.xml 代码如下

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 
 3 <!--
 4     status : 这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,会看到log4j2内部各种详细输出
 5     monitorInterval : Log4j能够自动检测修改配置文件和重新配置本身, 设置间隔秒数。
 6 -->
 7 <Configuration status="DEBUG" monitorInterval="6000">
 8 
 9     <Properties>
10         <!-- 配置日志文件输出目录 -->
11         <Property name="LOG_HOME" value="log/log_${main:0}" />
12         <Property name="LOG_NAME">http</Property>
13     </Properties>
14 
15     <Appenders>
16 
17         <!--这个输出控制台的配置-->
18         <Console name="Console" target="SYSTEM_OUT">
19             <!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
20             <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
21             <!-- 输出日志的格式 -->
22             <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
23         </Console>
24 
25         <!-- DEBUG日志格式 -->
26         <RollingFile name="service_debug_appender" fileName="${LOG_HOME}/${LOG_NAME}.log"
27                      filePattern="${LOG_HOME}/${LOG_NAME}.log.%d{yyyy-MM-dd}-%i" append="true" immediateFlush="true">
28             <Filters>
29                 <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
30             </Filters>
31             <!--
32                 %d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生产时间
33                 %p : 日志输出格式
34                 %c : logger的名称
35                 %m : 日志内容,即 logger.info("message")
36                 %n : 换行符
37                 %C : Java类名
38                 %L : 日志输出所在行数
39                 %M : 日志输出所在方法名
40                 hostName : 本地机器名
41                 hostAddress : 本地ip地址
42              -->
43             <PatternLayout>
44                 <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M -- %msg%xEx%n</pattern>
45             </PatternLayout>
46             <Policies>
47                 <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
48                 <SizeBasedTriggeringPolicy size="500 MB"/>
49             </Policies>
50         </RollingFile>
51 
52 
53         <!-- ERROR日志格式 -->
54         <RollingFile name="service_error_appender" fileName="${LOG_HOME}/${LOG_NAME}.error"
55                      filePattern="${LOG_HOME}/${LOG_NAME}.error.%d{yyyy-MM-dd}-%i" append="true" immediateFlush="true">
56             <Filters>
57                 <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
58             </Filters>
59             <PatternLayout>
60                 <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M -- %msg%xEx%n</pattern>
61             </PatternLayout>
62             <Policies>
63                 <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
64                 <SizeBasedTriggeringPolicy size="500 MB"/>
65             </Policies>
66         </RollingFile>
67     </Appenders>
68 
69     <Loggers>
70         <!-- 配置日志的根节点 -->
71         <Root level="debug">
72             <appender-ref ref="Console"/>
73             <appender-ref ref="service_debug_appender"/>
74             <appender-ref ref="service_error_appender"/>
75         </Root>
76 
77         <!-- 第三方日志系统 -->
78         <logger name="org.springframework" level="INFO"/>
79         <logger name="io.netty" level="warn"/>
80         <logger name="org.apache.http" level="warn"/>
81         <logger name="org.mongodb.driver" level="INFO"/>
82         <logger name="org.jboss.netty" level="warn"/>
83         <logger name="org.springframework.data.redis" level="INFO"/>
84 
85     </Loggers>
86 
87 </Configuration>
View Code

三、结果

  log 文件夹下产生log_${main:0} 文件夹,下面放着系统的日志

原文地址:https://www.cnblogs.com/milicool/p/8656264.html