2012-01-30 30 views
6

Kayıttan çıkarma projesinde bir sorunum var. Benim şartım dinamik olarak log özellikleri oluşturmak zorundayım. Bunu bir örnekle açıklamama izin ver.Logback logger program aracılığıyla oluşturuluyor

Projem, harici sistemle soket iletişimi oluşturuyor ve çok sayıda sokete sahip olabilir. Her soket için okunan ve gönderilen mesajları içerecek farklı günlük dosyalarına sahip olmak istiyorum. Bunu başarmak için, yuva için programlayıcı olarak logger yaratıyorum. Ben logback.xml (taramayı = "true" ekleyerek veya logback'i yeniden başlatarak) kullanarak logger'ları yeniden yapılandırmak istediğimde sorun yarattığım logger'lar kullanılamaz hale geliyor. Bunu nasıl düzeltebilirim yoksa başka bir çözüm önerebilir misin?

Bu benim yapılandırma dosyası (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> 

ve burada ben programlı kaydedicileri oluşturmak nasıl görebilirsiniz (yine ben soket günlükleri için sadece bunu).

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; 
} 

Ve bu senin ayırt edici soket kimliği kendisi veya herhangi kombine varyasyon olacağını nerede SiftingAppender gerekiyor gibi

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); 
    } 
} 

cevap

3

görünüyor logback yeniden başlatmak nasıl. Bu konuyla ilgileneceğiniz konuları (MDC okunduğunda, vb.) Bilmiyorum ama bu iyi bir başlangıç ​​noktası olmalı ve sizin durumunuza benziyor.

+0

Logback kullanım kılavuzunda http://logback.qos.ch/manual/mdc.html, "logback-classic değerlerin orta frekanslı MDC'ye yerleştirildiğini varsayar" yazılır. Saniyede 1000 istek işleyebilir mi? "Orta frekans" hakkında konuştuğumuzda TPS aralığı nedir? –

+0

Emin değilim. Yazarla iletişime geçebilir veya posta listesine yazabilirsiniz. Sadece bunu okumayı hatırladım ve sizin konuya benzediğini düşündüm. –

+1

Bu soruyu posta listesine gönderiyorum ve Ceki bir cevap verdi. İşte burada: "1000 MDC modifikasyonunun iyi olması gerektiğini düşünüyorum. Ayrıntılar için LogbackMDCAdapter [1] 'e bakın. Şerefe, [1] [link] http://logback.qos.ch/xref/ch/qos /logback/classic/util/LogbackMDCAdapter.html" –

İlgili konular