2012-01-30 13 views
6

बनाना मुझे लॉगबैक प्रोजेक्ट से संबंधित कोई समस्या है। मेरी आवश्यकता है कि मुझे गतिशील रूप से लॉग गुण बनाना होगा। मुझे इसे एक उदाहरण से समझाएं।लॉगबैक लॉगर प्रोग्रामेटिक रूप से

मेरी परियोजना बाहरी प्रणाली के साथ सॉकेट संचार बनाता है और इसमें कई सॉकेट हो सकते हैं। प्रत्येक सॉकेट के लिए, मैं अलग-अलग लॉग फ़ाइलों को रखना चाहता हूं जिनमें संदेश पढ़े और भेजे जाएंगे। इसे पूरा करने के लिए, मैं प्रोग्रामेटिक रूप से सॉकेट के लिए लॉगर बना देता हूं। समस्या तब होती है जब मैं logback.xml (स्कैन = "सत्य" जोड़कर या लॉगबैक को पुन: प्रारंभ करके लॉगर्स को पुन: कॉन्फ़िगर करना चाहता हूं), मेरे द्वारा बनाए गए लॉगर्स अनुपयोगी हो जाते हैं। मैं इसे कैसे तय कर सकता हूं या आप मुझे एक और समाधान की सलाह दे सकते हैं?

यह मेरा विन्यास फाइल (logback.xml)

<?xml version="1.0" ?> 
<configuration> 
    <property name="HOME_PATH" value="/data/logs/myapp/" scope="CONTEXT" /> 
    <property name="MYAPP_LOG_FILE" value="myapp.log" /> 
    <property name="MYAPP_ROLLING_TEMPLATE" value="%d{yy-MM-dd}" scope="CONTEXT" /> 
    <property name="MYAPP_OLD_LOG_FILE" value="${MYAPP_LOG_FILE}.%d{yy-MM-dd}" /> 
    <property name="DEFAULT_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%file:%line] [%level] %msg%n" scope="CONTEXT" /> 

    <appender name="myAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
     <file>${HOME_PATH}${MYAPP_LOG_FILE}</file> 
     <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
      <fileNamePattern>${HOME_PATH}${MYAPP_LOG_FILE}.${MYAPP_ROLLING_TEMPLATE}</fileNamePattern> 
     </rollingPolicy> 

     <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> 
      <pattern>${DEFAULT_PATTERN}</pattern> 
     </encoder> 
    </appender> 

    <logger name="com.myapp" level="DEBUG" additivity="false"> 
     <appender-ref ref="myAppender" /> 
    </logger> 

    <root level="OFF"> 
    </root> 
</configuration> 

है और यहां आप देख सकते हैं कि मैं वालों प्रोग्राम के रूप में बनाने (फिर से, मैं यह केवल सॉकेट लॉग के लिए करते हैं)।

public static Logger createLogger(String name) { 
     ch.qos.logback.classic.Logger templateLogger = (ch.qos.logback.classic.Logger) LogUtil.getLogger("com.myapp"); 
     LoggerContext context = templateLogger.getLoggerContext(); 

     String logDir = context.getProperty("HOME_PATH"); 

     PatternLayoutEncoder encoder = new PatternLayoutEncoder(); 
     encoder.setPattern(context.getProperty("DEFAULT_PATTERN")); 
     encoder.setContext(context); 

     DefaultTimeBasedFileNamingAndTriggeringPolicy<ILoggingEvent> timeBasedTriggeringPolicy = new DefaultTimeBasedFileNamingAndTriggeringPolicy<ILoggingEvent>(); 
     timeBasedTriggeringPolicy.setContext(context); 

     TimeBasedRollingPolicy<ILoggingEvent> timeBasedRollingPolicy = new TimeBasedRollingPolicy<ILoggingEvent>(); 
     timeBasedRollingPolicy.setContext(context); 
     timeBasedRollingPolicy.setFileNamePattern(logDir + name + ".log." + context.getProperty("MYAPP_ROLLING_TEMPLATE")); 
     timeBasedRollingPolicy.setTimeBasedFileNamingAndTriggeringPolicy(timeBasedTriggeringPolicy); 
     timeBasedTriggeringPolicy.setTimeBasedRollingPolicy(timeBasedRollingPolicy); 

     RollingFileAppender<ILoggingEvent> rollingFileAppender = new RollingFileAppender<ILoggingEvent>(); 
     rollingFileAppender.setAppend(true); 
     rollingFileAppender.setContext(context); 
     rollingFileAppender.setEncoder(encoder); 
     rollingFileAppender.setFile(logDir + name + ".log"); 
     rollingFileAppender.setName(name + "Appender"); 
     rollingFileAppender.setPrudent(false); 
     rollingFileAppender.setRollingPolicy(timeBasedRollingPolicy); 
     rollingFileAppender.setTriggeringPolicy(timeBasedTriggeringPolicy); 

     timeBasedRollingPolicy.setParent(rollingFileAppender); 

     encoder.start(); 
     timeBasedRollingPolicy.start(); 

     rollingFileAppender.stop(); 
     rollingFileAppender.start(); 

     ch.qos.logback.classic.Logger logbackLogger = (ch.qos.logback.classic.Logger) LogUtil.getLogger(name); 
     logbackLogger.setLevel(templateLogger.getLevel()); 
     logbackLogger.setAdditive(false); 
     logbackLogger.addAppender(rollingFileAppender); 

     return logbackLogger; 
} 

और यह मैं कैसे logback reinitialize

private static void initializeLogback() { 
    File logbackFile = new File(logFilePath); 
    System.setProperty("logback.configurationFile", logbackFile.getAbsolutePath()); 
    StaticLoggerBinder loggerBinder = StaticLoggerBinder.getSingleton(); 
    LoggerContext loggerContext = (LoggerContext) loggerBinder.getLoggerFactory(); 

    loggerContext.reset(); 
    JoranConfigurator configurator = new JoranConfigurator(); 
    configurator.setContext(loggerContext); 
    try { 
     configurator.doConfigure(logbackFile); 
    } catch(JoranException e) { 
     throw new ColumbusRuntimeException(e.getMessage(), e); 
    } 
} 

उत्तर

3

ऐसा लगता है कि SiftingAppender की जरूरत है, जहां आपके discriminator सॉकेट आईडी ही है, या किसी संयुक्त भिन्नता होगी। मुझे पता नहीं है कि आप किस थ्रेडिंग मुद्दों के साथ इसमें भाग लेंगे (जब एमडीसी पढ़ा जाता है, आदि), लेकिन यह एक अच्छा प्रारंभिक बिंदु होना चाहिए और आपके मामले के समान दिखता है।

+0

लॉगबैक मैनुअल http://logback.qos.ch/manual/mdc.html में, यह लिखा गया है कि "लॉगबैक-क्लासिक मानता है कि मान को आवृत्ति के साथ एमडीसी में रखा जाता है"। क्या यह प्रति सेकेंड 1000 अनुरोधों को संभाल सकता है? जब हम "मध्यम आवृत्ति" के बारे में बात करते हैं तो टीपीएस अंतराल क्या होता है? –

+0

सुनिश्चित नहीं है। आप लेखक से संपर्क कर सकते हैं, या मेलिंग सूची पर पोस्ट कर सकते हैं। मुझे बस इसके बारे में पढ़ना याद आया और इसे आपके मुद्दे के समान माना। –

+1

मैं इस प्रश्न को मेलिंग सूची में पोस्ट करता हूं और सेकी ने एक प्रतिक्रिया वापस कर दी। यहां यह है: "मुझे लगता है कि 1000 एमडीसी संशोधनों को ठीक होना चाहिए। विवरण के लिए लॉगबैकएमडीसी एडाप्टर [1] देखें। चीयर्स, [1] [लिंक] http://logback.qos.ch/xref/ch/qos /logback/classic/util/LogbackMDCAdapter.html " –

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