【问题标题】:Changing log file path property on the fly with Logback使用 Logback 即时更改日志文件路径属性
【发布时间】:2012-01-19 19:21:25
【问题描述】:

如何在 Logback 中动态更改日志文件路径?

在我的 Web 应用程序中,用户可以更改保存和处理某些电子邮件附件的位置。用户可以访问这个路径,看看处理后是否发生了一些错误,所以我想在这个路径中创建一个日志文件。为此,我尝试使用此 Logback 配置:

<configuration debug="true" scan="true" scanPeriod="30 seconds">
    <property scope="context" resource="com/hrgi/configuracoes/recuperadorNFe.properties" />
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%date{dd/MM/yyyy;HH:mm:ss} [%thread] %-5level %logger - %msg%n %ex{full}</pattern>
        </encoder>
    </appender>
    <appender name="importador" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${recuperadorNFe.diretorioDeArmazenamento}/logs/importador.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${recuperadorNFe.diretorioDeArmazenamento}/logs/%d{yyyy/MM}/importador-%d{dd}.log</fileNamePattern>
        </rollingPolicy>
        <encoder>
            <pattern>(%date{dd/MM/yyyy;HH:mm:ss} [%-5level]) -> %msg%n %nopex</pattern>
        </encoder>
    </appender>
    <logger name="com.hrgi.nfe" level="info">
        <appender-ref ref="importador" />
    </logger>
    <root level="info">
        <appender-ref ref="console" />
    </root>
</configuration>

如您所见,我希望重新启动记录器上下文,以便它可以看到属性文件的内容已更改并加载正确的值。无效:

private void restartLogContext(){
    LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
    loggerContext.stop();
    loggerContext.start();
    StatusPrinter.print(loggerContext);
}

所以我尝试删除 logger appender 并创建一个新的。至少日志文件是在新路径中创建的,但日志记录发生在控制台中:

private void restartLog(){
    LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();

    Logger logbackLogger = loggerContext.getLogger("com.hrgi.nfe");
    logbackLogger.detachAndStopAllAppenders();

    TimeBasedRollingPolicy policy= new TimeBasedRollingPolicy();
    policy.setContext(loggerContext);
    policy.setFileNamePattern(modeloPopup.getConfiguracoes().getDiretorioDeArmazenamento()+"/logs/%d{yyyy/MM}/importador-%d{dd}.log");

    RollingFileAppender fileAppender = new RollingFileAppender();
    fileAppender.setContext(loggerContext);
    fileAppender.setName("importador");
    fileAppender.setFile(modeloPopup.getConfiguracoes().getDiretorioDeArmazenamento()+"/logs/importador.log");
    fileAppender.setRollingPolicy(policy);

    policy.setParent(fileAppender);

    PatternLayoutEncoder encoder = new PatternLayoutEncoder();
    encoder.setContext(loggerContext);
    encoder.setPattern("(%date{dd MMM yyyy;HH:mm:ss} [%-5level]) -> %msg%n %nopex");
    encoder.start();

    fileAppender.setEncoder(encoder);
    fileAppender.start();

    logbackLogger.addAppender(fileAppender);        
    StatusPrinter.print(loggerContext);
}

谁能解释一下我做错了什么?

【问题讨论】:

    标签: java logging logback


    【解决方案1】:

    我只需扩展 ch.qos.logback.core.rolling.TimeBasedRollingPolicy 并将其传递给 RollingFileAppender

    看起来 appender 可以将其用作触发和滚动策略。只需在每次配置更改某处时执行rollover 并根据您的配置返回下一个文件名。 你应该看看方法isTriggeringEvent - 这使得appender翻转,rollover - 这实际上是翻转,还有getNewActiveFileName

    查看(RollingFileAppender 源码)[http://grepcode.com/file/repo1.maven.org/maven2/ch.qos.logback/logback-core/0.9.3/ch/qos/logback/core/ rolling/RollingFileAppender.java] 来了解如何连接它。它应该比配置更容易。

    【讨论】:

    • 谢谢彼得,我已经扩展了 TimeBasedRollingPolicy 并覆盖了翻转和 isTriggeringEvent,现在我可以动态更改日志文件路径...
    【解决方案2】:

    我认为您可能正在寻找的是SiftingAppender

    SiftingAppender 用于根据给定的运行时属性通过根据需要动态创建附加程序来分离(或筛选)日志记录。它根据运行时在 MDC 中设置的值将日志条目写入不同的文件。

    【讨论】:

      猜你喜欢
      • 2011-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多