먼저 몇 가지 배경. 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입니다.
흠, 내 사전 포맷 코드 블록은 하나 개의 라인으로 통해 온,하지만 미리보기에서 잘했다! 험프! –
David,이 질문을 다시 편집 할 수 있습니다. 필요한 경우 축 어적으로 사용하십시오. –
축 어적으로 참고 문헌이나 예제가 있습니까? 코드가 아닌 블록을 사용한다는 의미입니까? –