2015-02-02 1 views
0

내 프로젝트에서 Log4j를 구현 중입니다. 모든 n 개의 로그 항목을 새 파일에 기록하고 싶습니다. 나는 'RollingFileAppender'를 사용하여 시도했지만 크기와 시간만을 기준으로 로그 파일을 변경한다고 생각합니다. 내가 파일 이름이 매 10 개 항목을 변경 볼 수 있습니다 콘솔동적으로 Log4j 파일 이름 변경

public class ControlTableLoggerConsumer { 
static { 
    System.setProperty("log4jfilename","d:\\control_log_1_9.json"); 
} 
private static final Logger log = Logger.getLogger("ControlTable"); 
private static long logEntries = 0; 
public static void main(String args[]) { 
     System.out.println("Curr log file:"+logEntries+"::"+System.getProperty("log4jfilename")); 
     log.info("Log entry:"+logEntries); 
     logEntries++; 
     if((logEntries >= 10) && ((logEntries % 10) == 0)) { 
     System.out.println("going to change file name to "+"d:\\control_log_"+logEntries+"_"+(logEntries+9)+".json"); 
     System.setProperty("log4jfilename","d:\\control_log_"+logEntries+"_"+(logEntries+9)+".json"); 
     } 
     if(logEntries == 1000) 
     break; 
} 

log4j.logger.ControlTable=debug, controlTable 
log4j.additivity.ControlTable = false 
log4j.appender.controlTable=org.apache.log4j.RollingFileAppender 
log4j.appender.controlTable.File=${log4jfilename} 
log4j.appender.controlTable.MaxFileSize=10MB 
log4j.appender.controlTable.MaxBackupIndex=10 
log4j.appender.controlTable.layout=org.apache.log4j.PatternLayout 

홈페이지

log4j.properties :

지금까지 내가 코드를 아래로했다 ,하지만 내 D 드라이브에서 나는 모든 로그 정보가있는 하나의 파일 만 볼 수 있습니다.

+0

log4j2 태그를 제거 할 수 있습니까? 이것은 log4j1 전용 질문입니다. –

답변

1

마지막으로 아래에서이 문제를 해결했습니다.

Properties props = new Properties(); 
    try { 
     InputStream configStream = getClass().getResourceAsStream("/log4j.properties"); 
     props.load(configStream); 
     configStream.close(); 
    } catch (IOException e) { 
     System.out.println("Errornot laod configuration file "); 
    } 
    props.setProperty("log4j.appender.controlTable.File", logFile); 
    LogManager.resetConfiguration(); 
    PropertyConfigurator.configure(props); 

지금은 동적으로 다른 파일에 로그인 할 수 있습니다. 희망은 다른 사람들에게도 도움이되기를 바랍니다.

0

때문에 귀하의 솔루션은 나에게 매우 좋은 해결책이 될 것 같지 않습니다

  1. 이 appender는 로깅 코드에 더 이상 투명하지 않습니다 당신이 다른 장소에서 로그인하려고하는 경우가 매우 지저분하게
  2. , 당신은 그것을 저장할 일반적인 장소를 찾아야 만합니다. logEntries.

난 당신이 대부분 RollingFileAppender 안에 무엇이 복사 할 수 있지만 단지 서면 기록의 번호로 파일 크기에서 트리거 조건을 변경할 수 있습니다 내기 (사용자 정의이 appender를 작성하는 것이 좋습니다.

유무가 RollingFileAppender에서 간단히 살펴했다. 같은데 당신은 그것에서 연장하고, subAppend() 방법을 덮어 씁니다.

public class RowCountRollingFileAppender extends FileAppender { 
    // constructors 
    // getter setters 
    private maxEntries = 10;  // provided through config 

    private currentEntries = 0; 

    public void rollOver() { 
     currentEntries = 0; 
     super.rollOver(); 
    } 
    protected void subAppend(LoggingEvent event) { 
     super.subAppend(event); 
     currentEntries++; 
     if (fileName != null 
       && qw != null 
       && currentEntries > maxEntries) { 
      rollOver(); 
     } 
    } 
} 

는 그런 다음 두 파일이 최대 크기에 충돌하는 경우 이월 것이다 펜더를 가질 수있다, 또는 n 메시지가 기록 가질 수 있습니다.