2011-09-27 163 views
1

我有一個應用程序偵聽特定的端口來執行其任務。 該應用程序可以通過在參數中指定不同的 端口在多個實例上運行。Log4j日誌記錄以分離文件

MyApp的-1211.bat包含

java MyApp 1211 

MyApp的-1311.bat包含

java MyApp 1311 

MyApp的-1411.bat包含

java MyApp 1411 

這個應用程序日誌文件。問題是所有三個實例日誌 成一個文件,myApp.log。有沒有辦法告訴log4j使用 不同的日誌文件?像:

myApp-port1211.log 
myApp-port1311.log 
myApp-port1411.log 

回答

2

當然,你可以。一種方法是創建多個配置文件(log4j.xml/log4j.properties) - 每個端口分別進程一個。在加載配置文件,您可以選擇基於當前的端口號正確的:

PropertyConfigurator.configure("log4j-" + port + ".properties"); 

據此創建配置文件:log4j-1211.propertieslog4j-1311.properties,...

另一種方法是通過Java代碼在運行時配置文件記錄:

String logFilename = "./myApp-port" + port + ".log"; 
Layout layout = new PatternLayout("%d{ISO8601} %-5p [%t] %c{1}: %m%n"); 
FileAppender fileAppender = new FileAppender(layout, logFilename, false); 
fileAppender.setThreshold(Level.DEBUG); 
Logger.getRootLogger().addAppender(fileAppender); 
+0

是我目前使用log4j屬性文件 – user960740

+0

看到我更新的答案 – Robert

0

您可以參考系統屬性中的log4j.xml如下荷蘭國際集團:

<appender name="ROLL" class="org.apache.log4j.rolling.RollingFileAppender"> 
       <!-- The active file to log to --> 
       <param name="file" value="mylog${MY_PARAM}.log" /> 
</appender> 

現在,你只需要你的參數插入到系統屬性通過編程System.setProperty("MY_PARAM", args[0])到您的main()方法或當您正在運行的Java:

java -DMY_PARAM=1234 MyApp 1234

Obiously你可以,如果你避免dupplication正在運行你的應用程序從蝙蝠或shell腳本,如:

java -DMY_PARAM=%1 MyApp %1

請參閱以下參考資料的詳細信息:

http://wiki.apache.org/logging-log4j/Log4jXmlFormat

Using system environment variables in log4j xml configuration

+0

,這如何轉化爲一個屬性文件的XML文件,而不是在一個配置文件引起同樣的可能嗎? – user960740

0

如果你去加載性能配置文件自己,其他答案的建議,不要忘記禁用默認的log4j通過添加env來初始化。變量定義你的程序的命令行:

-Dlog4j.defaultInitOverride=true 
+0

你是什麼意思? – user960740

+0

@ user960740 Log4j在一個靜態代碼塊中有一個內置的默認初始化,在您有機會做一些事情之前可能會執行它。這個環境變量阻止了這個執行。你可能想要這樣做,以確保你開始準確地配置你想要的。 – MaDa