我有一个在 Tomcat 上运行的 Java Web 应用程序,在运行时执行 Shell 脚本,其中执行了许多“echo”命令。
我的问题是我希望所有日志都出现在 log4j RollingFileAppender 中,即:
- Java Log4j 日志(这很容易做到)
- 还有 Shell echo 命令日志(这对我来说是棘手的部分)
Shell 脚本通过 java.lang.Process 类运行。 到目前为止,由于 log4j 提供的 StreamUtils.copy() 方法,我已经设法将进程的 inputStream 和 errorStream 输出到 System.out。
但是这样就可以得到一些 ConsoleAppender 输出,而不是 RollingFileAppender 输出。
是否有任何方便的方法将流程流重定向到 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);
最佳答案
这是我用来记录过程输出的代码片段。非常简单,似乎有效。谢谢@mezzie。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.apache.log4j.Logger;
public class ProcessLoggerThread extends Thread {
private final static Logger LOGGER = Logger.getLogger(ProcessLoggerThread.class);
private InputStream inputStream;
public ProcessLoggerThread(InputStream inputStream) {
super();
this.inputStream = inputStream;
}
public void run() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line = reader.readLine();
while (line != null) {
LOGGER.debug(line);
line = reader.readLine();
}
reader.close();
LOGGER.debug("End of logs");
} catch (IOException e) {
LOGGER.error("The log reader died unexpectedly.");
}
}
}
关于java - 如何从在 log4j RollingFileAppender 中的 Java 中启动的 Shell 脚本输出日志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8230963/