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