다른 메시지를 두 파일에 기록하기위한 로그 백


146

logback / slf4j를 사용하여 로깅을 수행하고 있습니다. 로그 파일을 분석하여 일부 데이터를 분석하고 싶습니다. 따라서 큰 파일 (대부분 디버그 문으로 구성됨)을 구문 분석하는 대신 각각 별도의 파일에 로그하는 두 개의 로거 인스턴스가 필요합니다. 하나는 분석 용이고 다른 하나는 다목적 로깅 용입니다. Logback 또는 그 문제에 대한 다른 로거로 이것이 가능하는지 아는 사람이 있습니까?

답변:


296

로그 백에서 이와 같은 작업을 수행하는 것이 매우 가능합니다. 구성 예는 다음과 같습니다.

<?xml version="1.0"?>
<configuration>
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>logfile.log</file>
        <append>true</append>
        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
        </encoder>
    </appender>
    <appender name="ANALYTICS-FILE" class="ch.qos.logback.core.FileAppender">
        <file>analytics.log</file>
        <append>true</append>
        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
        </encoder>
    </appender>
    <!-- additivity=false ensures analytics data only goes to the analytics log -->
    <logger name="analytics" level="DEBUG" additivity="false">
        <appender-ref ref="ANALYTICS-FILE"/>
    </logger>
    <root>
        <appender-ref ref="FILE"/>
    </root>
</configuration>

그런 다음 두 개의 별도 로거를 설정합니다. 하나는 모두를위한 것이고 다른 하나는 분석 데이터를 다음과 같이 기록합니다.

Logger analytics = LoggerFactory.getLogger("analytics");

1
이런 종류의 작업을 수행하여 동일한 파일에 줄 바꿈이없는 appender와 일반 appender를 가질 수 있습니다. 이 정보에 감사드립니다.
djangofan

다른 appender-ref가 지정된 경우 IMO additivity = false가 기본값이어야합니다. 타이머 이벤트로 인해 일부 모듈이 매우 빈번한 로그 생성기 인 응용 프로그램을 얻는 경우가 많으며 이러한 로그를 다른 파일로 분리하려고합니다. 10 개의 서로 다른 파일에 동일한 로그를 기록하는 것은 실제로 의미가 없습니다. 따라서 기본값이 아닌 옵트 인 기능이어야합니다. 로그 백이 다시 작성되었으므로 동일한 작성자가 동일한 실수를 수정해야합니다.
samarjit samanta

다른 파일에 오류, 디버그, 정보 메시지를 각각 기록하고 싶습니다. logback.xml로 가능합니까
Qasim


다른 패키지의 로그를이 답변과 같은 다른 파일에 로그하려고 시도하지만 작동하지 않습니다. 내 로그 백 XML 추출은 pastebin.com/Aii4f1Jk 입니다. 최대 절전 모드 패키지 TRACE 수준 로그를 다른 파일에 기록하려고합니다. 어떤 제안?
Andy Dufresne

7

원하는만큼의 로거를 가질 수 있습니다. 그러나 각 패키지마다 다르게 기록해야하는 것이 좋습니다. 그런 다음 해당 패키지 및 하위 패키지의 모든 클래스는 해당 로거를 가져옵니다. 모두 루트 로거를 공유하고 additivity = "true"를 사용하여 로그 데이터를 루트 로거 어 펜더로 보낼 수 있습니다. 예를 들면 다음과 같습니다.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

<property name="pattern" value="%date{HH:mm:ss.SSS} %-5p %logger{36} 
%X{akkaSource} [%file:%line] - %m%n" />

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%date{HH:mm:ss.SSS} %-5p %logger{36} %X{akkaSource} [%file:%line] - %m%n</pattern>
    </encoder>
</appender>

<appender name="abc" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${catalina.base}/logs/worker.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${catalina.base}/logs/worker-%d{yyyy-MM-dd_HH}.log</fileNamePattern>
        <maxHistory>360</maxHistory>
    </rollingPolicy>
    <encoder>
        <pattern>${pattern}</pattern>
    </encoder>
</appender>

<appender name="xyz" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${catalina.base}/logs/transformer.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${catalina.base}/logs/transformer-%d{yyyy-MM-dd_HH}.log</fileNamePattern>
        <maxHistory>360</maxHistory>
    </rollingPolicy>
    <encoder>
        <pattern>${pattern}</pattern>
    </encoder>
</appender>

<logger name="com.xxx.yyy.zzz" level="INFO" additivity="true">
    <appender-ref ref="xyz"/>
</logger>

<logger name="com.aaa.bbb.ccc" level="INFO" additivity="true">
    <appender-ref ref="abc"/>
</logger>

<root>
    <level value="INFO" />
    <appender-ref ref="STDOUT" />
</root>


2

제 경우에는 클래스 이름을 로그 이름으로 남기고 싶었습니다.

private static final Logger log = LoggerFactory.getLogger(ScheduledPost.class);

그런 수업이 거의 없었기 때문에 logback.xml

<!--additivity=false ensures this log data only goes to the this log, and no one more -->
<logger name="xxx.xxx.xxx.ScheduledPost" level="DEBUG" additivity="false">
    <appender-ref ref="ASYNC_SCHEDULE_LOG_FILE"/>
</logger>
<logger name="xxx.xxx.xxx.GcmPost" level="DEBUG" additivity="false">
    <appender-ref ref="ASYNC_SCHEDULE_LOG_FILE"/>
</logger>
<logger name="xxx.xxx.xxx.PushUtils" level="DEBUG" additivity="false">
    <appender-ref ref="ASYNC_SCHEDULE_LOG_FILE"/>
</logger>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.