2009-02-25 4 views
5

log4j.xml에는 다음이 포함왜 내 Log4j 로그 파일의 타임 스탬프가 잘못되어 있으며 어떻게 수정합니까?

<appender class="org.jboss.logging.appender.RollingFileAppender" name="rm"> 
    ... 
    </layout> 

내 로그 파일은 순서가 타임 스탬프를 보여줍니다. 타임 스탬프를 기준으로 표시 할 수 있습니까?

 
2009-02-19 14:47:01,288 DEBUG [com.catalystwms.core.persistence.TransactionContext] 
2009-02-19 14:54:27,429 INFO [com.catalystwms.tms.services.background.purge.PurgeManager] 
2009-02-19 14:47:01,288 DEBUG [com.catalystwms.core.services.ServiceLocator]

도와주세요.

감사합니다.

+0

여러 서버의 로그를 하나의 log4j appender로 수집하고 있습니까? 비동기 애 퍼처를 사용하고 있습니까? 우리는 여러분의 log4j.xml을 보면서 무엇이 진행되고 있는지 알 필요가 있습니다. – Eddie

+0

예. 다중 스레드가 하나의 서버 내에서 실행 중이고 RollingFileAppender를 asyncappender가 아닌 사용하고 있습니다. 감사합니다. –

답변

3

두 개의 로그 문이 서로 다른 스레드에서 발생합니까?

(스레드 1) 2009-02-19 14 : 54 : 27,429 INFO [com.catalystwms.tms.services.background.purge.PurgeManager]
(스레드 2) 2009-02-19 14 : 47 : 01,288 DEBUG [COMM.catalystwms.core.services.ServiceLocator]

로그 문은 이벤트가 발생한 시간을 비례 적으로 알려주지 만 스레드 2가 잠금을 얻으려고 기다리고 있기 때문에 순서가 잘못 작성되었다고 생각합니다. org.apache.log4j.AsyncAppender에서 appender를 래핑하는 것이 문제를 해결해야한다고 생각합니다.

+0

예. 다중 스레드가 실행 중입니다. RollingFileAppender의 AsyncAppender instaed를 사용해야합니까? –

+0

RollingFileAppender가 AsyncAppender를 감싸도록 유지할 수 있습니다. 어떻게 구성해야할지 모르겠지만 코드 AsyncAppender에는 메서드가 있습니다. public void addAppender (org.apache.log4j.Appender newAppender) – richs

2

날짜 형식은 간단한 문자 기반 정렬이 올바르게 정렬 할 수 있도록 설계되었습니다.

sort server.log | more 

EDIT : 기존 로그 파일 (log4j 구성이 아님)에서 사용하는 데 유용합니다.

+0

log4j.xml에서 어떻게 사용할 수 있습니까? –

+0

을 명확히하십시오. 그것을 log4j에서 사용하지 마십시오. 나중에 로그에 사용합니다 (아마 읽고있을 때). –

+0

그 항목이 어디로 가야하는지 모릅니다. 내 로그가 동적으로 생성되었습니다. –

-1

아마도 로그를 작성하기 전에 수정할 수 없습니다. 매번 write 후에 log4J를 호출하여 .flush()를 호출 할 수는 있지만, 코드가 더 느려지고 @Chris Nava의 해결책이 더 적절할 것입니다.

1

두 개의 다른 프로세스가 롤링 appender를 사용하여 동일한 로그 파일에 기록됩니다. Log4j는 이것을 허용하지 않습니다. 과거에는 로그 파일에 서버 이름을 추가하여 클러스터 된 웹 응용 프로그램에서이 문제를 해결했습니다. appname-server1.logappname-server2.log 각 서버는 자체 로그에 쓰기 위해 구성되었습니다.

이것은 한 컴퓨터의 구성에 특정한 버그를 추적하는 데 유용 할 수 있습니다.

위의 모든 내용은 실행중인 응용 프로그램에 따라 파일의 이름을 지정하여 동일한 로그 파일에 두 개의 다른 응용 프로그램을 쓰는 경우에도 작동합니다. 응답

0

는 @andy한다 :
(스레드 1) 2009-02-19 14 : 54 : 27,429 INFO [com.catalystwms.tms.services.background.purge.PurgeManager]
(스레드 2) 2009-02-19 14 : 47 : 01,288 DEBUG [com.catalystwms.core.services.ServiceLocator

제가 판단 발생 될 수있다 2 실 (14)에서의 LogRecord 만들고입니다 47 : 01,288 그것은에 시도 쓰기, 로거의 appenders 목록에 대한 잠금을 얻을 필요가 있지만 다른 스레드가 잠금을 가지고 있으며 스레드 2 대기 있도록 IO 작업을하고있다. thread 1은 14 : 54 : 27,429에 logRecord를 생성하여 동일한 잠금을 얻으려고 시도하고 기다립니다. 잠금이 해제되면 OS는 스레드 1에 그것을 제공하고 인쇄합니다.

이것이 사실이라면 다른 큰 문제는 성능 중 하나입니다. 입출력 로깅시 코드 경로가 차단 될 수 있습니다.

관련 문제