2012-07-06 4 views
1

log4j를 사용하여 CSV 파일을 쓰려고합니다. CSV 헤더는 작성 될 때마다 로그 파일 맨 위에 작성해야합니다. 예를 들어, 이러한 압연 모든 파일은 로그 파일의 첫 번째 행으로 다음이 있어야합니다,log4j에서 롤오버가 발생했을 때 프로그래밍 방식으로 결정하는 방법은 무엇입니까?

log.0 타임 스탬프, 이름, 분 타임 스탬프

log.1 최대, 이름, 분,

최대 최대

log.2 타임 스탬프, 이름, 분, 그것은 I 헤더를 추가 할 수 있도록 롤오버가 발생되었는지를 판정 할 수 있습니까?

감사합니다.

P.S : 오픈 소스 CSV 작성기가 많이 있지만 소프트웨어에서 기존 로그 기능을 사용하고 싶기 때문에 사용하지 않는 것이 좋습니다.

+0

. 예를 들어, 여러 클래스 로깅이 있거나 응용 프로그램이 다중 스레드되거나 분산되어있는 경우입니다. 당신이 이야기하고있는 이벤트 (로그 파일이 롤백되는 시점을 감지)가 존재하고 감지 할 수 있다고 가정 해 봅시다. 로그에 대한 쓰기가 정렬된다는 보장은 없습니다. 즉, 핸들러가 롤을 생성 한 실제 로그 항목보다 먼저 다음 로그 파일에 헤더를 추가 할 수 있습니다. 필자는 스크립트를 통해 수동으로 파일에 헤더를 삽입하는 것과 같은 다른 방법을 고수 할 것입니다. – Viccari

+0

좋은 지적. 필자의 경우 CSV 로깅은 단일 클래스를 통과하므로 동기화가 보장됩니다. RollingFileAppender 소스를 살펴보면 롤오버가 발생했는지 확인하기위한 공개 API가 없습니다. 실제로 현재 로그 파일이 최대 값에 도달했는지, 복사본인지, 현재 파일을 삭제했는지, 지정된 파일 이름을 가진 다른 파일을 생성했는지, 그리고 로그 파일에 로그인하는지 여부 만 확인합니다. 그러나 RollingFileAppender.getFile()을 사용하여 appender가 사용하는 현재 파일 이름을 알 수 있으며 롤오버 발생 여부를 알기 위해 파일의 타임 스탬프를 확인할 수 있습니다. – partheinstein

+0

그리고 응용 프로그램 외부에서 한 번에 모든 로그 파일에 헤더를 삽입하는 방법은 무엇입니까? – Viccari

답변

5

RollingFileAppender에 대한 log4j 설명서를 보면 롤오버라는 메서드가 있습니다.

http://logging.apache.org/log4j/1.2/apidocs/index.html

당신은 RollingFileAppender에서 상속 사용자 정의 파일 어 펜더를 구현하고 롤오버 메서드를 재정의해야합니다. 나는 당신이 super.rollOver를 호출 할 수 있다고 상상해 본 다음, 무엇인가가 기록되기 전에 새로운 파일에 헤더로 원하는 것을 씁니다.

+0

실제로, 그 일을 내가 끝내 었습니다. 나는 붙여 넣은 RollingFileAppender 코드를 복사하고 롤오버가 발생할 때마다 증가하는 카운터를 추가했습니다. RollingFileAppender 자체에서이 기능을 사용하는 것이 좋을 것입니다. – partheinstein

+0

기꺼이 도와 드릴 수 있습니다 (즉, 내가 대답하기 전에이 문제를 직접 파악하지 않았다면). 이것이 올바른 대답이라면, 올바른 것으로 표시 할 수 있습니까? – Jim

+0

로거가 구현 된 클래스를 사용하도록 구성하는 방법은 무엇입니까? – Tomer

0

내가 사용이 하나의

public class MyRoller extends RollingFileAppender { 

@Override 
public void rollover() { 
    super.rollover(); 

    final LoggingEvent event = new LoggingEvent(); 
    event.setMessage("CSV_HEADER;1;2;3;4;..."); 
    event.setLevel(Level.INFO); 

    append(event); 
} 

} 좋은 아이디어 같은 소리하지 않습니다

관련 문제