나는 많은 "echo"명령이 실행되는 런타임에 쉘 스크립트를 실행하여 Tomcat에서 실행되는 Java Webapplication을 가지고있다.log4j RollingFileAppender에서 Java 내에서 시작된 쉘 스크립트에서 로그를 출력하는 방법?
- 쉘 에코뿐만 아니라 로그 명령 (쉽게 할 수있다)
- 자바의 log4j 로그 (:
내 문제는 내 모든 로그 즉, log4j에 RollingFileAppender에 표시 할 것입니다 어느 날 까다로운 부분입니다)
쉘 스크립트는 java.lang.Process 클래스를 통해 실행됩니다. 지금까지 log4j에서 제공 한 StreamUtils.copy() 메소드 덕분에 System.out에 프로세스의 inputStream 및 errorStream을 출력 할 수있었습니다.
그러나 ConsoleAppender 출력을 얻는 것이 좋지만 RollingFileAppender 출력은 아닙니다.
프로세스 스트림을 RollingFileAppender로 리디렉션하는 편리한 방법이 있습니까? Log4j 구성 또는 Java 코드에서?
다음<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);
감사합니다. 귀하의 답변에 영감을 받았습니다 (코드에 대한 내 답변 참조). 이상하지만 log4j의 기본 기능은 아닙니다. 아파치 사람들이 주변에 있다면 ...;) –