log4 j 설정 파일에 로그를 일별로 분할하도록 설정했는데
로그가 일별로 분할되지 않는 오류가 있습니다.
이 오류는 현재 버전에서 수정이 되었는지 확인은 해봐야겠지만
이미 오래전부터 오류가 지적되었던 오류입니다.
다중 인스턴스 환경에서 파일 전화이 잘 되지 않는 현상으로 알려져 있고
제가 확인 한 환경은 단일 인스턴스 환경에서 23:59:59에서 00:00:00으로 넘어갈 때
실행 중이 스레드가 여러 개일 때 분할하지 못했습니다.
제가 설정한 파일 분할은 일단위 이기 때문에 위와 같은 현상이 발생했습니다.
log4j.appender.dailyfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyfile.File=logs/aud_debug.log
log4j.appender.dailyfile.Threshold=DEBUG
log4j.appender.dailyfile.Append=false
log4j.appender.dailyfile.DatePattern='.'yyyyMMdd
log4j.appender.dailyfile.layout=org.apache.log4j.PatternLayout
log4j.appender.dailyfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %C{1}.%M %m [%t]%n
그래서 log4 j의 DailyRollingFileAppender를 수정했습니다.
해당 class의 rollOver() 메서드를 보면
File target = new File(this.scheduledFilename);
if(target.exists()) {
target.delete();
}
if(! target.exists()) {
File file = new File(this.fileName);
boolean result = file.renameTo(target);
if(result)
LogLog.debug(this.fileName + " -> " + this.scheduleFilename);
else {
LogLog.error("Failed to rename [" + this.fileName + "] to [" + this.scheduledFilename + "].");
}
위와 같이 되어 있는데 여기서 아래의 구문이 정상 동작하지 않아 파일 분할되지 않는 것을 확인했습니다.
if(target.exists()) {
target.delete();
}
그래서 다음과 같이 예외처리를 추가했습니다.
try {
if(target.exists()) {
target.delete();
}
} catch(Exception e) {
this.errorHandler.error("$$$ file delete exception ");
}
코드는 아래에서 확인 가능합니다.
File target = new File(this.scheduledFilename);
try {
if(target.exists()) {
target.delete();
}
} catch(Exception e) {
this.errorHandler.error("$$$ file delete exception ");
}
if(! target.exists()) {
File file = new File(this.fileName);
boolean result = file.renameTo(target);
if(result)
LogLog.debug(this.fileName + " -> " + this.scheduleFilename);
else {
LogLog.error("Failed to rename [" + this.fileName + "] to [" + this.scheduledFilename + "].");
}
그리고 위 구문을 수정하여 log4 j 라이브러리를 다시 생성하지 않고
헤딩 classe 파일을 패키지에 DailyRollingFileAppenderDump로 생성하고
log4 설정을 변경했습니다.
log4j.appender.dailyfile=org.apache.log4j.DailyRollingFileAppenderDump
log4j.appender.dailyfile.File=logs/aud_debug.log
log4j.appender.dailyfile.Threshold=DEBUG
log4j.appender.dailyfile.Append=false
log4j.appender.dailyfile.DatePattern='.'yyyyMMdd
log4j.appender.dailyfile.layout=org.apache.log4j.PatternLayout
log4j.appender.dailyfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %C{1}.%M %m [%t]%n
변경 후 정상 동작 확인하였습니다.
이 현상이 발견되지 않은 버전을 사용한다면 문제없겠지만
문제가 발견된다면 위와 같이 처리하는 방법도 좋을 것 같습니다.