2014-05-12 44 views
0

我正在創建一個管理工具,可根據需要啓動不同的任務。我遇到以下奇怪的現象:我無法通過ProcessBuilderRuntime.exec和log4j(1.2.17)登錄控制檯來啓動應用程序。沒有記錄到控制檯它工作得很好。記錄到文件,例如它也工作得很好。手動啓動jar從命令行啓動並記錄到控制檯也可以正常工作。ProcessBuilder:無法根據log4j啓動程序

由於顯而易見的原因,我很喜歡它,如果我不需要手動添加一行來刪除控制檯appender,那麼每次使用管理工具測試jar時都是如此。

我Log4j追加:

<appender name="console" class="org.apache.log4j.ConsoleAppender"> 
    <param name="Target" value="System.out" /> 
    <layout class="org.apache.log4j.PatternLayout"> 
    <param name="ConversionPattern" value="%-5p %c{1} - %m%n" /> 
    </layout> 
</appender> 

我的代碼以啓動罐子: ArrayList的命令=新的ArrayList(); commands.add(「java」); commands.add(「 - jar」); commands.add(file.getAbsolutePath());

for (CommandLineArgument arg : args) { 
    commands.add("-" + arg.getKey() + "=" + arg.getDefaultArgument()); 
} 
ProcessBuilder processBuilder = new ProcessBuilder(commands); 

DateFormat dateFormat = new SimpleDateFormat("-dd-MM-yyyy-HH-mm-ss"); 
String logFileName = baseLogDir + processId + dateFormat.format(new Date()) + ".log"; 

File stdOutFile = new File(logFileName + ".stdout"); 
if(!stdOutFile.exists()) 
    stdOutFile.createNewFile(); 
processBuilder.redirectInput(stdOutFile); 
log.debug("redirecting stdout to " + stdOutFile.getAbsolutePath()); 

File stdErrFile = new File(logFileName + ".stderr"); 
if(!stdErrFile.exists()) 
    stdErrFile.createNewFile(); 
processBuilder.redirectError(stdErrFile); 
log.debug("redirecting stderr to " + stdErrFile.getAbsolutePath()); 

log.info("starting module with the following command: " + processBuilder.command()); 
return processBuilder.start(); 

回答

0

我解決了這個問題。

供將來參考:從log4j appender中刪除<param name="Target" value="System.out" />。之後它不會寫入std.out,但它確實啓動得很好。也許它有時間遷移到log4j2,所以也許這個問題在log4j2中不存在。

最後的附加器:

<appender name="console" class="org.apache.log4j.ConsoleAppender"> 
    <layout class="org.apache.log4j.PatternLayout"> 
    <param name="ConversionPattern" value="%-5p %c{1} - %m%n" /> 
    </layout> 
</appender>