2010-06-04 14 views
8

पहले कुछ पृष्ठभूमि को रोकने के लिए कैसे रोकें। मेरे पास एक बैच-प्रकार जावा प्रक्रिया है जो एक डॉस बैच स्क्रिप्ट से चलती है। सभी जावा लॉगिंग 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 है।

+0

हम्म, मेरी पूर्वस्वरूपित कोड ब्लॉक एक पंक्ति के रूप में के माध्यम से आते हैं, लेकिन पूर्वावलोकन में ठीक थे! Humpf! –

+0

डेविड, आप इस प्रश्न को दोबारा संपादित कर सकते हैं, अगर आपको जरूरी है तो वर्बैटिम का उपयोग करें। –

+0

शब्दशः पर एक संदर्भ या उदाहरण मिला? क्या आपका मतलब गैर-कोड ब्लॉक का उपयोग करना है? –

उत्तर

2

में होता है अंत फिक्सिंग में के साथ सिंक में किसी भी कामकाज की तुलना में अंतर्निहित मुद्दा आसान था। सुधार के लिए

पैच: http://gist.github.com/434516

बग logback jira में बढ़ा: http://jira.qos.ch/browse/LBCORE-158

+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 

दूसरी पंक्ति अपनी परिभाषा की जगह में डिफ़ॉल्ट पद्धति का उपयोग कर किया जा रहा है: इन दोनों के पैटर्न जब गंदगी को डिकोड करने की कोशिश कर बहुत अलग हो रहा है। क्या वहां कोई लॉगर लोड किया गया है जो आपके एक्सएमएल कॉन्फ़िगरेशन के बजाय डिफ़ॉल्ट कॉन्फ़िगरेशन का उपयोग करता है?

+0

अन्य पैटर्न तीसरे पक्ष के lib से आता है। लेकिन यह पैटर्न नहीं है जो मुझे परेशान करता है, यह गड़बड़ लाइन है। कोई बात नहीं, मैंने अब इस मुद्दे को ठीक करने के लिए लॉगबैक पैच किया है। धन्यवाद। –

2

ऐसे मामले में मैं दिए गए तृतीय पक्ष lib के लिए System.setOut (प्रिंटस्ट्रीम आउट) के माध्यम से जाऊंगा जो व्यवहार नहीं करता है। एक थ्रेड को कार्यान्वित करें जो लॉग की इस धारा को विभाजित करेगा, यह नई लाइन द्वारा कहता है और इसे आपके द्वारा उपयोग किए जाने वाले लॉगिंग समाधान पर थूकता है।

  • आप एक तरफ यह बचाने System.out स्ट्रीम प्राप्त
  • आप इस का उपयोग करने के लिए अपने लकड़हारा कॉन्फ़िगर करें: बस पढ़ने और एक ही धागे के लिए लिख :-) शुरू करने के लिए नहीं यह तुम क्या करते है सावधान रहना होगा स्ट्रीम देखें OutputStreamAppender
  • आप एक थ्रेड बनाते हैं जो एक नई प्रणाली के रूप में असाइन की गई स्ट्रीम को निकाल देता है।बाहर (अपने 3 पार्टी lib वहाँ लिखेंगे) और लॉग

को अच्छी तरह से स्वरूपित उत्पादन भेज आप अपने आप को एक बहुत लॉग मिला कि कम या ज्यादा क्या प्रणाली

+0

धन्यवाद बोरिस, आपके पास एक अच्छा विचार था, दुर्भाग्यवश यह कोड काम को ठीक करने के लिए और अधिक काम था। मैंने उखाड़ फेंका है, लेकिन आपका जवाब स्वीकार नहीं किया है। –

संबंधित मुद्दे