2011-08-09 14 views
8

मैं अपने सेलेनियम ढांचे का संक्षिप्त विवरण देने की कोशिश करूंगा ताकि मैं अपनी समस्या को समझा सकूं।लॉगबैक में समानांतर धागे लॉगिंग

मैं सेलेनियम 2 (वर्तमान संस्करण 2.3.1) + TestNG 5,14

मैं समानांतर में टेस्ट स्वीट में परीक्षण चलाने के लिए testng.xml फ़ाइल निर्धारित करते हैं, सिर्फ 2 उदाहरणों

का उपयोग प्रवेश के प्रयोजनों के लिए, मैं का उपयोग logback

मेरे समस्या यह है कि जब जाँच क्या एप्लिकेशन लॉग मैं कुछ इस तरह मिल (मैं पढ़ा है लॉग दुनिया में दूसरी सबसे बड़ी चीज है):

18: 48: 58.551 [TestNG] जानकारी daastsetup.TestConfiguration - उपयोगकर्ता पूल से प्राप्त कर रहा है यादृच्छिक उपयोगकर्ता

18: 48: 58.551 [TestNG] जानकारी daastsetup.TestConfiguration - प्राप्त कर रहा है से यादृच्छिक उपयोगकर्ता उपयोगकर्ता पूल

18: 48: 58.551 [TestNG] डीबग daastsetup.TestConfiguration - डेटाबेस

acccessing

18 के लिए डेटा स्रोत बनाना: 48: 58.551 [TestNG] डीबग daastsetup.TestConfiguration - 0 48: 58.552 [TestNG] डीबग daastsetup.TestConfiguration - शुभारंभ एसक्यूएल क्वेरी -: 48: एसक्यूएल क्वेरी

18 का शुभारंभ 58.552 [TestNG] डीबग daastsetup.TestConfigurationडेटाबेस

acccessing

18 के लिए डेटा स्रोत बनाना

18: 48: 59.613 [TestNG] ट्रेस daastsetup.TestConfiguration - क्वेरी सफल

18: 48: 59.613 [TestNG] ट्रेस daastsetup.TestConfiguration - क्वेरी सफल

जैसा कि आप देख सकते हैं, यह दो धागे कि एक ही समय में चल रहे हैं के बीच अंतर को देखने के लिए असंभव है। मेरा सवाल यह है कि, क्या मैं एक तरीका है कि मैं लॉगबैक सेटिंग्स को कॉन्फ़िगर कर सकता हूं ताकि वे चल रहे प्रत्येक थ्रेड को पहचानने के लिए कोई संख्या या आईडी भी जोड़ सकें?

पीडी बस के मामले में यह मदद मिल सकती है, मेरे logback.xml फ़ाइल इस तरह दिखता है:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 

    <appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
    <file>logs/selenium.log</file> 

    <encoder> 
     <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern> 
    </encoder> 
    </appender> 

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <!-- encoders are assigned the type 
     ch.qos.logback.classic.encoder.PatternLayoutEncoder by default --> 
    <encoder> 
     <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> 
    </encoder> 
    </appender> 

    <root level="trace"> 
    <appender-ref ref="FILE" /> 
    <appender-ref ref="STDOUT" /> 
    </root> 
</configuration> 

आपकी मदद के लिए धन्यवाद =)

} {रामबाण

उत्तर

10

Logback Mapped Diagnostic Context (एमडीसी) आपका दोस्त है। यह आपको थ्रेड स्थानीय चर जोड़ने की अनुमति देता है जिसे प्रबंधित किया जा सकता है, धागे के बीच कॉपी किया जा सकता है, और लॉगिंग प्रारूप का उपयोग करके लॉग इन किया जा सकता है।

डॉक्स से:

logback के डिजाइन लक्ष्यों में से एक ऑडिट करने के लिए और डिबग जटिल वितरित अनुप्रयोगों है।अधिकांश वास्तविक दुनिया वितरित सिस्टमों को एक साथ कई ग्राहकों से निपटने की आवश्यकता होती है। इस तरह के एक सिस्टम के एक विशिष्ट बहुप्रचारित कार्यान्वयन में, विभिन्न धागे विभिन्न ग्राहकों को संभालेगा। एक क्लाइंट के लॉगिंग आउटपुट को दूसरे से अलग करने के लिए एक संभावित लेकिन थोड़ा हतोत्साहित दृष्टिकोण प्रत्येक क्लाइंट के लिए एक नया और अलग लॉगर को तुरंत चालू करने के होते हैं। यह तकनीक लॉगर्स के प्रसार को बढ़ावा देती है और उनके प्रबंधन ओवरहेड को बढ़ा सकती है।

एक हल्का तकनीक विशिष्ट किसी दिए गए ग्राहक सर्विसिंग प्रत्येक लॉग अनुरोध मुद्रांकन के होते हैं। नील हैरिसन प्रोग्राम डिजाइन 3 के पैटर्न बोली, आर मार्टिन, डी Riehle, और एफ Buschmann (एडिसन-वेस्ले, 1997) द्वारा संपादित नैदानिक ​​संदेश लॉगिंग के लिए पुस्तक पैटर्न में इस विधि का वर्णन किया। लॉगबैक एसएलएफ 4 जे एपीआई में शामिल इस तकनीक का एक संस्करण प्रदान करता है: मैप्ड डायग्नोस्टिक कंटेक्स (एमडीसी)।

विशिष्ट प्रत्येक अनुरोध टिकट के लिए, उपयोगकर्ता MDC, मैप निदान प्रसंग का संक्षिप्त नाम में प्रासंगिक जानकारी डालता है। एमडीसी कक्षा के मुख्य भाग नीचे दिखाए गए हैं। विधियों की पूरी सूची के लिए कृपया MDC javadocs देखें।

+0

धन्यवाद, Ceki! एमडीसी ने मेरे लिए पूरी तरह से ठीक काम किया। अगर किसी को दिलचस्पी है, मैं एक श्रोता वर्ग (** TestListenerAdapter ** के उपवर्ग) बना लिया है और पद्धति पर onStart (ITestContext TestContext) मैं इस लाइन डाल: ** MDC.put ("परीक्षण", testContext.getName()) ; ** – Panacea

5

FYI करें, आप कर सकते हैं उत्पादन% धागा http://logback.qos.ch/manual/configuration.html पर दस्तावेज़ में वर्णित का उपयोग कर धागा आईडी:

The output is formatted using a PatternLayoutEncoder set to the pattern %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n. 
3

आप अप्रत्याशित नाम आप आमतौर पर मैं के रूप में% धागे से प्राप्त करने के लिए एक विकल्प चाहते हैं, तो करें, आप साधारण थ्रेड-स्थानीय आईडी का उपयोग कर सकते हैं। आंखों पर यह बहुत आसान है। यह logback के साथ काम करेंगे ...

public class ThreadIdConverter extends ClassicConverter { 
    private static int nextId = 0; 
    private static final ThreadLocal<String> threadId = new ThreadLocal<String>() {  
    @Override 
    protected String initialValue() { 
     int nextId = nextId(); 
     return String.format("%05d", nextId); 
    } 
    }; 

    private static synchronized int nextId() { 
    return ++nextId; 
    } 

    @Override 
    public String convert(ILoggingEvent event) { 
    return threadId.get(); 
    } 
} 

फिर अपने logback एक्सएमएल में इस सरल रेखा डाल:

<conversionRule conversionWord="tid" 
    converterClass="com.yourstuff.logback.ThreadIdConverter" /> 

इस तरह अपने पैटर्न कुछ (नोटिस "टीआईडी") सेट करें:

<pattern>%d{HH:mm:ss.SSS} [%tid] %-5level - %msg%n</pattern> 

और आपके लॉग में इस तरह दिखेगा:

10:32:02.517 [00001] INFO something here 
10:32:02.517 [00002] INFO something here 
10:32:02.517 [00003] INFO something here 
10:32:02.517 [00001] INFO something more here 
10:32:02.517 [00001] INFO something more here 

आप कस्टम एक्सटेंशन का समर्थन करने वाले किसी भी लॉगर के साथ ऐसा कर सकते हैं। आशा करता हूँ की ये काम करेगा।

+2

आप इस्तेमाल कर सकते हैं [AtomicInteger] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicInteger.html) के बजाय अपने nextId पद्धति पर तुल्यकालन के साथ परेशान कर रहा से । –

+0

उत्कृष्ट उदाहरण। मेरी मदद की, धन्यवाद! – JavaTec

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