У меня есть веб-приложение Java, работающее на Tomcat, выполняющее сценарии оболочки во время выполнения, в котором выполняются многие команды «эхо».
Моя проблема в том, что я хочу, чтобы все мои журналы отображались в log4j RollingFileAppender, то есть:
- Журналы Java Log4j (что легко сделать)
- Журналы эхо-команд оболочки (что для меня сложно)
Сценарии оболочки запускаются через класс java.lang.Process. До сих пор мне удавалось выводить inputStream и errorStream процесса в System.out благодаря предоставленному log4j методу StreamUtils.copy().
Но тогда это нормально, чтобы получить некоторый вывод ConsoleAppender, но не вывод RollingFileAppender.
Есть ли удобный способ перенаправить потоки процессов в RollingFileAppender? В конфигурации Log4j или из кода Java?
Вот моя конфигурация приложения LOG4J:
<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);