I have a Java Webapplication application running on Tomcat, running shell scripts at runtime, in which many echo commands are executed.
My problem is that I would like all my logs to appear in log4j RollingFileAppender, i.e.:
- Java Log4j logs (easy to do)
- Shell echo commands as well (for me, this is the hard part)
Shell scripts are run through the java.lang.Process class. So far, I have managed to output the inputStream and errorStream of the process to System.out thanks to the StreamUtils.copy () method provided by log4j.
But then it's fine to get ConsoleAppender output, but not RollingFileAppender output.
Is there a convenient way to redirect process threads in RollingFileAppender? In Log4j configuration or from Java code?
Here is my 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>
Here is my script launch code:
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);
source share