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

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



답변

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

<?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");


답변

원하는만큼의 로거를 가질 수 있습니다. 그러나 각 패키지마다 다르게 기록해야하는 것이 좋습니다. 그런 다음 해당 패키지 및 하위 패키지의 모든 클래스는 해당 로거를 가져옵니다. 모두 루트 로거를 공유하고 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>


답변

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

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>


답변