2011-09-27 212 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