目標:根據啟動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} 文件夾,下面放着系統的日志