【发布时间】:2011-12-02 02:00:16
【问题描述】:
我有一个在 Tomcat 上运行的 Java Web 应用程序,在运行时执行 Shell 脚本,其中执行了许多“echo”命令。
我的问题是我希望我的所有日志都出现在 log4j RollingFileAppender 中,即:
- Java Log4j 日志(很容易做到)
- Shell 回显命令日志也是如此(这对我来说是个棘手的部分)
Shell 脚本通过 java.lang.Process 类运行。 到目前为止,由于 log4j 提供的 StreamUtils.copy() 方法,我已经成功地将进程的 inputStream 和 errorStream 输出到 System.out。
但是这样可以得到一些 ConsoleAppender 输出,而不是 RollingFileAppender 输出。
是否有任何方便的方法可以将 Process 流重定向到 RollingFileAppender?在 Log4j 配置中还是来自 Java 代码?
这是我的 LOG4J appender conf:
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<param name="Threshold" value="DEBUG" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ABSOLUTE} [%-20.20t] %-5p [%-25.25c{1}] - %m%n" />
</layout>
</appender>
<appender name="FILE" class="org.apache.log4j.RollingFileAppender">
<param name="Threshold" value="DEBUG" />
<param name="File" value="&LOG_DIR;/&PROJECT_NAME;.log" />
<param name="Append" value="&APPEND;" />
<param name="MaxFileSize" value="&MAX_SIZE;" />
<param name="MaxBackupIndex" value="&MAX_BACKUP;" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ISO8601} | %-21.21X{applicationId}| %-40.40t| %-5p |%-25.25c{1}| - %m%n" />
</layout>
</appender>
这是我的启动脚本代码:
ProcessBuilder pb = new ProcessBuilder("sh", "script.sh");
Process p = pb.start();
StreamUtils.copy(p.getInputStream(), System.out);
StreamUtils.copy(p.getErrorStream(), System.out);
int result = p.waitFor();
LOG.info("Script ended with result " + result);
return (result == 0);
【问题讨论】:
标签: java shell logging log4j echo