2014-01-22 2 views
0

2 개의 파일에 비동기 적으로 로깅하려면 하나는 시스템 로깅 용이고 다른 하나는 사용자 작업 로깅 용입니다.2 파일에 비동기로 로깅

<configuration debug="true"> 

    <property name="LOG_DIR" value="C:/blah" /> 

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
     <encoder> 
      <pattern>%d{DD/MM/YYYY-HH:mm:ss.SSS} %-5level %logger{36} - %msg%n 
      </pattern> 
     </encoder> 
    </appender> 

    <appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
     <file>${LOG_DIR}/log.txt</file> 
     <encoder> 
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg%n 
      </pattern> 
     </encoder> 
    </appender> 

    <logger name="com.logger.name" level="DEBUG" /> 

    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender"> 
     <appender-ref ref="FILE" /> 
    </appender> 

    <root level="warn"> 
     <appender-ref ref="STDOUT" /> 
     <appender-ref ref="ASYNC" /> 
    </root> 

</configuration> 

그리고 나는 이런 로거를 만들 : 지금까지 내가 한 파일에 로그인하고, 내 설정 파일은 다음과 같습니다

public static final Logger LOG = LoggerFactory.getLogger("com.logger.name"); 

이 잘 작동하지만 내가 2에 로그인하려면 별도의 파일, 두 번째 구성 파일을 작성해야합니까? 두 번째 Logger 개체도 필요합니까? 하나의 구성을 갖고 싶고 어떤 파일이 Logger 개체를 만들 때 기록되는지를 지정하고 싶습니다. 가능합니까? 감사!

편집 그냥 하나 개의 파일과 다른 시스템 로그에 사용자 작업을 기록 할 명확히합니다.

답변

1

시스템 로깅 용 및 기타 사용자 작업 로깅 용으로 두 개의 파일 어 펜더를 사용할 수 있습니다. 파일 appnder 확장 UnsynchronizedAppenderBase 따라서 그들은 비동기입니다. Logger 객체를 작성할 필요가 없습니다. 다음은 예제입니다.

<appender name="fileAppender1" class="ch.qos.logback.core.FileAppender"> 
     <file>c:/kp/kp1.log</file> 
     <filter class="com.kp.filters.KPFilter"> 
     </filter> 
     <append>true</append> 
     <encoder> 
      <pattern>%d [%thread] %-5level %logger{35} - %msg%n</pattern> 
     </encoder> 
    </appender> 

    <root level="DEBUG"> 
     <appender-ref ref="fileAppender1" /> 
    </root> 

    <appender name="fileAppender2" class="ch.qos.logback.core.FileAppender"> 

     <file>c:/kp/kp2.log</file> 
     <append>true</append> 
     <encoder> 
      <pattern> 
       %d [%thread] %-5level %logger{30} - %msg%n 
      </pattern> 
     </encoder> 
    </appender> 

    <logger name="org.kp"> 
     <appender-ref ref="fileAppender2" /> 
     <level value="debug"/> 
    </logger> 

KPFilters.class

public class KPFilter extends Filter<ILoggingEvent> { 

    @Override 
    public FilterReply decide(ILoggingEvent event) { 
     if(event.getLoggerName() !=null && event.getLoggerName().startsWith("org.kp")){ 
      return FilterReply.DENY; 
     } 
     return FilterReply.ACCEPT; 
    } 

} 

당신이 당신의 패키지에 의해 생성 된 파일에 기록되는 로그를 가지고 싶다면, 최악의 시나리오에서

<logger name="com.kp"> 
     <level value="trace" /> 
     <appender-ref ref="fileappender2" /> 
</logger> 

아래에 주어진 사용 할 수 있습니다 UnsynchronizedAppenderBase을 확장하여 사용자 정의 appender를 생성하고 오류 메시지를 처리하는 사용자 정의 코드를 작성할 수 있습니다. 메시지 유형 또는 메시지 문자열을 기반으로 파일에 쓰거나 오류 메시지를 건너 뛰기위한 비즈니스 로직을 작성할 수 있습니다.

**EDITED:** 

일반적인 방법으로 로그를 초기화 할 수 있습니다. 예를 들어, MyClass에 로그인하려는 경우.

private static final Logger LOG = LoggerFactory.getLogger(MyClass.class); 
LOG.warn("Hello"); 

로그백은 로그 인스턴스를 두 애펜더에게 전달합니다. 두 개의 서로 다른 파일에 기록됩니다.

+0

그래서 나는 'AsyncAppender'에서 파일 appenders를 참조 할 필요가 없다는 것을 의미합니까? 또한 2 파일에 로깅 할 때 Java에서 로거를 초기화하는 방법은 무엇입니까? – Sionnach733

+0

@ Sionnach733 대답을 업데이트했습니다. 이미 비동기가 필요합니다. 대신 두 번째 파일에 대해 하나 더 appender를 만듭니다. –

+0

확인해 주셔서 감사합니다. 나는 내 질문을 다시해야한다. 한 파일에 사용자 작업을 기록하고 다른 파일에 시스템 로그를 기록하려고합니다. – Sionnach733