java - 如何从在 log4j RollingFileAppender 中的 Java 中启动的 Shell 脚本输出日志?

标签 java shell logging log4j echo

我有一个在 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} | &#x25;-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/

相关文章:

java - JGit/EGit 加载翻译包失败 zh_CN

ios - Appledoc 无法在 Xcode 中运行

php - 从 php 脚本写入 .log 文件时创建新行

java - 如果底层Java进程终止,如何使gradle运行终止?

java - 将字符串转换为其整数 ascii 值

java - 更改 ScrollBar 末端按钮的背景颜色

linux - Shell 脚本不适用于 crontab

bash - 如何在 awk 脚本中使用 shell 变量?

python - 如何从日志文件条目中计算每小时的访问次数?

sql - Microsoft LogParser : How to use parameters in a file