动态配置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>
三、结果
log 文件夹下产生log_${main:0} 文件夹,下面放着系统的日志