ProcessBuilder:根据log4j无法启动程序

时间:2014-05-12 06:35:43

标签: java logging log4j

我正在创建一个管理工具,可以按需启动不同的任务。我遇到了以下奇怪的问题:我无法启动ProcessBuilderRuntime.exec和log4j(1.2.17)登录到控制台的应用程序。没有登录到控制台它工作得很好。例如,通过记录到文件,它也可以正常工作。从命令行手动启动jar并启用日志记录到控制台也可以正常工作。

出于显而易见的原因,我很喜欢它,如果我每次使用管理工具测试jar时都不必手动添加一行来删除控制台appender。

我的log4j Appender:

<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>

启动jar的代码:     ArrayList commands = new ArrayList();     commands.add(&#34;的java&#34);     commands.add(&#34;罐子&#34);     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();

1 个答案:

答案 0 :(得分: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>