我正在创建一个管理工具,可以按需启动不同的任务。我遇到了以下奇怪的问题:我无法启动ProcessBuilder
或Runtime.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();
答案 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>