पहले कुछ पृष्ठभूमि को रोकने के लिए कैसे रोकें। मेरे पास एक बैच-प्रकार जावा प्रक्रिया है जो एक डॉस बैच स्क्रिप्ट से चलती है। सभी जावा लॉगिंग stdout पर जाती है, और बैच स्क्रिप्ट stdout को फ़ाइल में रीडायरेक्ट करता है। (यह मेरे लिए अच्छा है क्योंकि मैं स्क्रिप्ट से ईसीएचओ कर सकता हूं और यह लॉग फ़ाइल में आता है, इसलिए मैं सभी जावा जेवीएम कमांड लाइन तर्क देख सकता हूं, जो डिबगिंग के लिए बहुत अच्छा है।) मैंलॉग-बैक और तृतीय पक्ष लिखने के लिए stdout। उन्हें
मैं slf4j का उपयोग करता हूं एपीआई, और बैकएंड के लिए मैं log4j का उपयोग करता था, लेकिन हाल ही में लॉगबैक-क्लासिक में स्विच किया गया था।
हालांकि मेरा सभी एप्लिकेशन कोड slf4j का उपयोग करता है, मेरे पास एक तृतीय पक्ष लाइब्रेरी है जो स्वयं का लॉगिंग (मानक एपीआई का उपयोग नहीं कर रही है) जो स्टडआउट पर भी लिखी जाती है।
समस्या यह है कि कभी-कभी लॉग लाइनें मिश्रित हो जाती हैं और अलग-अलग लाइनों पर स्पष्ट रूप से दिखाई नहीं देती हैं। यहाँ कुछ में गड़बड़ उत्पादन का एक उदाहरण है:
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)
में केवल एक ही लिखने की विधि कह सकता हूं।
तो प्रत्येक बाइट आउटपुट लॉगबैक के बीच, तृतीय पक्ष लाइब्रेरी stdout पर एक संपूर्ण स्ट्रिंग लिखने के लिए प्रबंधन कर रही है। (न केवल यह मुझे एक समस्या का कारण बनता है, लेकिन यह थोड़ा अक्षम भी होना चाहिए?)
क्या इस इंटरलिविंग समस्या को कंसोल लक्ष्य पर कोड पैच करने से कोई अन्य फिक्स है, तो यह अन्य लेखन विधियों को लागू करता है? आसपास के किसी भी अच्छे काम। या मुझे बस एक बग रिपोर्ट दर्ज करनी चाहिए?
<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>
मैं logback 0.9.20 उपयोग कर रहा हूँ जावा 1.6.0_07 साथ:
यहाँ मेरी logback.xml है।
हम्म, मेरी पूर्वस्वरूपित कोड ब्लॉक एक पंक्ति के रूप में के माध्यम से आते हैं, लेकिन पूर्वावलोकन में ठीक थे! Humpf! –
डेविड, आप इस प्रश्न को दोबारा संपादित कर सकते हैं, अगर आपको जरूरी है तो वर्बैटिम का उपयोग करें। –
शब्दशः पर एक संदर्भ या उदाहरण मिला? क्या आपका मतलब गैर-कोड ब्लॉक का उपयोग करना है? –