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


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.