Logback - 如何使每个记录器记录到单独的日志文件?

6
我的应用程序有很多EJBs。当前定制的Logger实现创建一个像这样的记录器; private static Logger logger = Logger.getInstance("SERVICE_NAME");
, 并且日志将被写入文件;
(path)/SERVICE_NAME/SERVICE_NAME.log
我想使用logback复制此行为,但在logback.xml配置中真正难以获取“logger”名称。它可以在日志编码器模式中看到,即“%d %-5level %logger{35} - %msg %n”。
有什么想法如何将其放入属性/变量中,然后在元素中使用它?
2个回答

6

我有一个部分解决方案。如果我创建自己的判别器,我可以将该判别器用于logback.xml文件中实现每个EJB独立日志文件。

判别器;

public class LoggerNameBasedDiscriminator implements Discriminator<ILoggingEvent> {

private static final String KEY = "loggerName";

private boolean started;

@Override
public String getDiscriminatingValue(ILoggingEvent iLoggingEvent) {
    return iLoggingEvent.getLoggerName();
}

@Override
public String getKey() {
    return KEY;
}

public void start() {
    started = true;
}

public void stop() {
    started = false;
}

public boolean isStarted() {
    return started;
}

}

这是我的 logback.xml 文件;

    <configuration debug="true" scan="true" scanPeriod="30 seconds">

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

  <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
    <discriminator class="package.to.LoggerNameBasedDiscriminator"/>
     <sift>
      <appender name="FILE-${loggerName}" class="ch.qos.logback.core.FileAppender">
    <FILE>path/to/logs/${loggerName}/${loggerName}.log</FILE>
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} %-50(%level %logger{35}) %msg%n</pattern>
     </encoder>
      </appender>
     </sift>
    </appender>

    <root level="debug">
    <appender-ref ref="STDOUT" />
    <appender-ref ref="SIFT" />
    </root>
</configuration>

这个解决方案似乎可以工作,但我现在没有基于时间或大小的日志轮换!


2
您可以将RollingFileAppender嵌套在SiftingAppender中。 - yayitswei

1
由于您的示例,我实现了一个基于loggername的鉴别器的解决方案,将不同的日志输出路由到不同的文件。虽然logback的文档非常冗长,但我找不到这个重要的信息。您肯定已经找到了yayitswei提到的解决方案。

logback.xml:

[...]
<timestamp key="startTimestamp" datePattern="yyyy-MM-dd"/>
<timestamp key="folderTimestamp" datePattern="MM-yyyy"/>

<property name="LOGDIR" value="/var/log/spock" />

<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
    <discriminator class="com.enterprise.spock.LoggerNameBasedDiscriminator" />
    <sift>
        <appender name="FILE-${loggerName}" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${LOGDIR}/${loggerName}-${startTimestamp}.log</file>
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <fileNamePattern>${LOGDIR}/${folderTimestamp}/${loggerName}-%d{yyyy-MM-dd}-%i.log.gz</fileNamePattern>
                <maxFileSize>500KB</maxFileSize>
                <maxHistory>100</maxHistory>
                <totalSizeCap>50MB</totalSizeCap>
            </rollingPolicy>
            <encoder>
                <charset>UTF-8</charset>
                <pattern>%level %date{HH:mm:ss.SSS}: %msg %n</pattern>
            </encoder>
        </appender>
    </sift>
</appender>
[...]

编辑:

我按照这里的建议,将 TimeBasedRollingPolicy 替换为 SizeAndTimeBasedRollingPolicy。你需要至少 logback 1.1.7。

使用这种方式,每个创建的 Logger 都会有一个日志文件。每个日志文件都会像这样:/var/log/loggername-2017-08-03.log。

当文件写入了大约 500KB 后,它将被归档为 gz-zip 文件,并保存在 /var/log/loggername/08-2017/loggername-2017-08-03-0.log.gz 中。

gz-zip 文件名末尾的 0 是上面 <fileNamePattern> 中的 %i。没有 %i 将无法正常工作。如果出现问题,请记得在 logback.xml 中使用 <configuration debug=true>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接