2011-10-19 17 views
11

मैं मुसीबत जब एक log4j PatternLayout (log4j patternLayout)log4j, patternLayout, वर्ग और श्रेणी

  • श्रेणी (% ग) में इस्तेमाल किया उन दो log4j रूपांतरण अक्षरों का उपयोग के बीच सटीक अंतर स्थापित करने कर रहा हूँ
  • वर्ग (% सी)

किसी ने मुझे एक उदाहरण दे सकते हैं जहां उन दो अलग होगा?

श्रेणी हमेशा वर्ग के नाम से मेल नहीं करता है?

सादर,

उत्तर

17

यह वही अगर आप लोकप्रिय प्रलेखन द्वारा सुझाए गए तरीके से लकड़हारा प्रारंभ हो जाएगा, और X वर्ग के अंदर इसका इस्तेमाल:

Logger logger = Logger.getLogger(com.foo.X.class); 

तो आप मिल जाएगा %c और %C के लिए एक ही है, क्योंकि लकड़हारा नाम ("com.foo.X.class.getName()" द्वारा निर्मित) वर्ग के नाम है, जहां एक प्रवेश बयान जारी किया गया था से मेल खाएगा।

अपने लकड़हारा "कुछ"

Logger logger = Logger.getLogger("something"); 

कॉल करें और आप %c के लिए "कुछ" और %C के लिए वर्ग के नाम होगा।

ध्यान दें कि %C को वर्तमान थ्रेड के स्टैक ट्रेस से लॉग 4j द्वारा गणना की जाती है, इसलिए इसमें %c के विपरीत, बड़े प्रदर्शन प्रभाव पड़ता है, जो कि केवल एक स्ट्रिंग है। आप इसे प्रमाणित करने के लिए एक दिलचस्प प्रयोग का संचालन कर सकते हैं:

package com.foo; 

class A { 
    private Logger = Logger.getLogger(B.class); 
    // ... 
    logger.log("inside A class"); 
} 

पैटर्न [%c][%m]B संभालने के लिए उत्पादन पैकेज com.foo में है हो जाएगा:

[com.foo.B][inside A class] 

पैटर्न [%C][%m] के लिए उत्पादन B के स्थान की परवाह किए बिना होगा हो:

[com.foo.A][inside A class]