2012-01-30 2 views
6

프로젝트를 로그백하는 것과 관련하여 문제가 있습니다. 내 요구 사항은 동적으로 로그 속성을 만들어야한다는 것입니다. 예를 들어 설명해 드리겠습니다.프로그래밍 방식으로 로그백 로거 만들기

내 프로젝트는 외부 시스템과 소켓 통신을 생성하며 소켓이 여러 개있을 수 있습니다. 각 소켓에 대해, 나는 읽혀지고 보내지는 메시지를 담고있는 다른 로그 파일을 갖고 싶다. 이것을 달성하기 위해서, 소켓 용의 로거를 프로그램에 의해 작성합니다. Logback.xml을 기반으로 로거를 재구성하려는 경우 (즉, scan = "true"를 추가하거나 로그백을 다시 초기화하여) 내가 만든 로거는 사용할 수 없게됩니다. 어떻게 해결할 수 있습니까? 아니면 다른 해결책을 알려 줄 수 있습니까?

이 내 구성 파일 (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; 
} 

는 그리고 이것은 내가 당신의 판별이 소켓 ID 자체, 또는 결합 변화 될 것이다 어디가 SiftingAppender이 필요한 것처럼

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

이 보이는 logback 다시 초기화하는 방법입니다. MDC를 읽었을 때 어떤 스레딩 문제가 생길지 모르겠지만, 이것은 좋은 출발점이되어야하며 귀하의 경우와 유사합니다.

+0

로그백 설명서 http://logback.qos.ch/manual/mdc.html에서 "logback-classic은 값이 적당한 빈도로 MDC에 저장된다고 가정합니다"라고 기록되어 있습니다. 초당 1000 건의 요청을 처리 할 수 ​​있습니까? "중간 주파수"에 관해 이야기 할 때 TPS 간격이란 무엇입니까? –

+0

확실하지 않습니다. 작성자에게 연락하거나 메일 링리스트에 게시 할 수 있습니다. 나는 이것에 관해 독서를 기억하고 당신의 문제와 유사하다고 생각했습니다. –

+1

나는이 질문을 메일 링리스트에 올리고 Ceki는 응답을 보냈다. 여기에 그것은 : "나는 1000 MDC 수정이 잘되어야한다고 생각한다. 자세한 내용은 LogbackMDCAdapter [1]을 참고하십시오. /logback/classic/util/LogbackMDCAdapter.html " –

관련 문제