2012-01-19 67 views
2

如何在Logback中随时更改日志文件路径?使用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); 
} 

所以我试过删除记录器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); 
} 

有人能解释我什么,我做错了什么?

回答

3

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

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

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

+0

感谢彼得,我已经延长了TimeBasedRollingPolicy并覆盖翻转和isTriggeringEvent,现在我可以更改dinamically日志文件路径... – brevleq

3

我想你可能要找的是SiftingAppender

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

+0

这比Piotr的解决方案容易得多,谢谢! – Alphaaa