重新登录以将不同的消息记录到两个文件


146

我正在使用logback / slf4j进行日志记录。我想解析我的日志文件以分析一些数据,所以我不想解析一个很大的大文件(主要由调试语句组成),而是要有两个记录器实例,每个实例都记录到一个单独的文件中。一种用于分析,另一种用于通用日志记录。有谁知道使用Logback或任何其他记录器可以做到这一点吗?

Answers:


296

很可能在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");

1
我需要做这样的事情,以便我可以在同一文件中使用无换行的附加程序和常规附加程序。感谢您提供此信息。
djangofan 2013年

如果指定了不同的appender-ref,则IMO additivity = false应该是默认值。很多时候,我们得到的应用程序中,由于某些计时器事件,某些模块将成为非常频繁的日志生成器,并且我们希望将这些日志分成不同的文件。将相同的日志记录到10个不同的文件中实际上没有任何意义。因此,它应该是默认启用功能。由于logback是重写操作,因此相同的错误应由同一作者更正。
samarjit samanta,2015年

我想分别在不同文件中记录错误,调试,信息消息。logback.xml是否可能
Qasim


我试图将日志从不同的软件包记录到不同的文件,如此答案所示,但这对我不起作用。我的logback xml摘录在这里-pastebin.com/Aii4f1Jk。我正在尝试将休眠程序包TRACE级别的日志记录到另一个文件中。有什么建议?
安迪·杜弗雷斯

7

您可以根据需要拥有任意数量的记录器。但是,最好为每个需要以不同方式登录的软件包提供一个。然后,该程序包及其子程序包中的所有类都将获得该特定记录器。他们都可以共享root记录器,并使用additivity =“ true”将其日志数据发送到root记录器追加程序。这是一个例子:

<?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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.