2010-06-04 1 views
8

먼저 몇 가지 배경. DOS 배치 스크립트에서 실행되는 일괄 처리 유형의 Java 프로세스가 있습니다. 모든 Java 로깅은 stdout으로 가고 일괄 처리 스크립트는 stdout을 파일로 리디렉션합니다. (필자는 스크립트에서 ECHO 수는 로그 파일에 도착, 그래서 디버깅을 위해 중대하다 모든 자바 JVM 명령 행 인수를 볼 수 있기 때문에 나에게 좋다.) 나는stdout에 대한 로그백 및 thirdparty 쓰기. 어떻게 그들을 interleaved 얻는 중지하십시오

내가 SLF4J를 사용할 수 없습니다 API를 사용했고, 백엔드에서는 log4j를 사용했지만 최근에는 logback-classic으로 전환했습니다.

비록 모든 응용 프로그램 코드가 slf4j를 사용하지만 표준 라이브러리를 사용하지 않고 자체 표준 로깅을 수행하는 제 3 자 라이브러리가 있습니다.

문제는 때때로 로그 라인이 섞여서 별도의 줄에 나타나지 않는 것이 문제입니다. 여기에 몇 가지 엉망 출력의 예는 다음과 같습니다

2010-05-28 18:00:44.783 [thread-1  ] INFO CreditCorrelationElementBuilderImpl - Bump parameters exist for scenario, now attempting bumping. [indexDisplayName=STANDARD_S1_v300] 
2010-05-28 18:01:43.517 [thread-1  ] INFO CreditCorrelationElementBuilderImpl - Found adjusted point in data, now applying bump. [point=0.144040000000000] 
2010-05-28 18:01:58.642 [thread-1  ] DEBUG com.company.request.Request   - Generated request for [dealName=XXX_20050225_01[5],dealType=GENERIC_XXX,correlationType=2,copulaType=1] in 73.8 s, Simon Stopwatch: [sys1.batchpricer.reqgen.gen INHERIT] total 1049 s, counter 24, max 74.1 s, min 212 ms 
2010-05-28 18:05/28/10 18:02:20.236 INFO: [ServiceEvent] SubmittedTask:BC-STRESS_04_FZBC-2010-05-21-545024448189310126-23 
01:58.658 [req-writer-2b ] INFO .c.g.r.o.OptionalFileDocumentOutput - Writing request XML to \\filserver\dir\file1.xml - write time: 21.4 ms - Simon Stopwatch: [sys1.batchpricer.reqgen.writeinputfile INHERIT] total 905 ms, counter 24, max 109 ms, min 10.8 ms 
2010-05-28 18:02:33.626 [ResponseCallbacks-1: DriverJobSpace$TakeJobRunner$1] ERROR c.c.s.s.D.CalculatorCallback  - Id:23 no deal found !! 
2010-0505/28/10 18:02:50.267 INFO: [ServiceEvent] CompletedTask:BC-STRESS_04_FZBC-2010-05-21-545024448189310126-23:Total:24 

이제 오래된 로그 파일을 다시 비교, 로깅 백엔드로의 log4j를 사용할 때 문제가 발생하지 않은 것 같다. 따라서 로그백은 다른 무언가를해야합니다.

PrintStream.write(byte buf[], int off, int len)이 동기화되어 있지만 문제가있는 것 같습니다. 그러나 ch.qos.logback.core.joran.spi.ConsoleTarget that System.out.write(int b)에서 볼 수있는 유일한 쓰기 방법입니다.

따라서 각 바이트를 출력하는 logback 중에 thirdparty 라이브러리는 전체 문자열을 stdout에 쓰는 것을 관리하고 있습니다. (이것이 문제가 될뿐만 아니라 약간 비효율적 일 수도 있습니다.)

ConsoleTarget에 코드를 패치하는 것보다 다른 인터럽트 문제가 있습니까? 다른 쓰기 방법이 필요합니까? 어떤 멋진 일을 할 수 있습니다. 아니면 그냥 버그 보고서를 제출해야합니까?

<configuration> 
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
     <encoder> 
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-16thread] %-5level %-35.35logger{30} - %msg%n</pattern> 
     </encoder> 
    </appender> 
    <root level="DEBUG"> 
     <appender-ref ref="STDOUT" /> 
    </root> 
</configuration> 

내가 자바 1.6.0_07와 logback 0.9.20을 사용하고 있습니다 :

여기 내 logback.xml입니다.

+0

흠, 내 사전 포맷 코드 블록은 하나 개의 라인으로 통해 온,하지만 미리보기에서 잘했다! 험프! –

+0

David,이 질문을 다시 편집 할 수 있습니다. 필요한 경우 축 어적으로 사용하십시오. –

+0

축 어적으로 참고 문헌이나 예제가 있습니까? 코드가 아닌 블록을 사용한다는 의미입니까? –

답변

0

STDOUT에 쓰는 두 가지 로그 구성이있는 것처럼 보입니다.

2010-05-28 18:01:58.658 [req-writer-2b ] INFO .c.g.r.o.OptionalFileDocumentOutput - Writing request XML to \\filserver\dir\file1.xml - write time: 21.4 ms - Simon Stopwatch: [sys1.batchpricer.reqgen.writeinputfile INHERIT] total 905 ms, counter 24, max 109 ms, min 10.8 ms 
05/28/10 18:02:20.236 INFO: [ServiceEvent] SubmittedTask:BC-STRESS_04_FZBC-2010-05-21-545024448189310126-23 

두 번째 줄은 당신의 정의 대신에 기본 패턴을 사용하는 것 같다 :이 두 가지의 패턴은 혼란을 디코딩 할 때 매우 다른 것 같다. XML 구성 대신 기본 구성을 사용하는 로거가로드되어 있습니까?

+0

다른 패턴은 타사 lib에서 제공됩니다. 그러나 그것은 나를 괴롭히는 패턴이 아닙니다. 엉망진창입니다. 신경 쓰지 마라, 지금 문제를 해결하기 위해 logback을 패치했다. 감사. –

2

그런 경우에는 작동하지 않는 주어진 타사 라이브러리에 대해 System.setOut (PrintStream out)을 거쳐야합니다. 이 로그 스트림을 읽는 스레드를 구현하여 새 라인으로 말하고 사용하는 로깅 솔루션에 침을 뱉어 라.

  • 당신은
  • 당신은이를 사용하도록 로거를 구성 따로 저장 System.out을 스트림을 얻을 : 그냥이 당신이 무엇을 읽고 :-) 동일한 스레드에 쓰기를 시작하지 않도록주의 스트림 참조 OutputStreamAppender
  • 새 시스템으로 할당 한 스트림을 배출하는 스레드를 만듭니다.밖으로 (당신의 제 3 자 lib 디렉토리가 작성합니다) 및 로그

에 잘 형식화 된 출력을 보내 당신은 자신에게 꽤 로그를 가지고이 더 많거나 적은 끝 고정에서 시스템

+0

감사합니다. Boris, 좋은 생각이있었습니다. 불행히도 코드 문제를 수정하는 것이 더 많은 작업이었습니다. 나는 upvoted했지만 대답을 수락하지 않았습니다. –

관련 문제