2012-01-19 12 views
2

Logbackですぐにログファイルのパスを変更するにはどうすればよいですか?Logbackで即時にログファイルパスのプロパティを変更する

私のウェブアプリケーションのユーザは、いくつかの電子メールの添付ファイルが保存され処理される場所を変更することができます。ユーザーはこのパスにアクセスし、処理後に何らかのエラーが発生したかどうかを確認できます。このパスにログファイルを作成します。これを実現するために、私はこの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); 
} 

私はロガーアペンダーを削除して新しいものを作成しようとしました。少なくとも、ログファイルは新しいパスで作成されましたが、ログはコンソールに起こっている:

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に渡すだけです。

これは、アペンダーがトリガーとローリングのポリシーとして使用できるようです。設定がどこかで変更されるたびにrolloverにして、設定に基づいて次のファイル名を返します。 isTriggeringEventの方法を見てください。これはアペンダーのロールオーバーを行い、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]を使用して、どのように接続するのかを知ることができます。設定に苦労するよりは簡単です。

+0

私はTimeBasedRollingPolicyを拡張し、ロールオーバーとisTriggeringEventを上書きしました。これでログファイルのパスをdinamically変更することができます。 – brevleq

3

あなたが探しているものはSiftingAppenderだと思います。

SiftingAppenderは、必要に応じてアペンダーを動的に作成することによって、特定のランタイムアトリビュートに従ってロギングを分離(または選別)するために使用されます。実行時にMDCに設定された値に基づいて、ログ・エントリーを異なるファイルに書き込みます。

+0

これはPiotrのソリューションよりずっと簡単です! – Alphaaa

関連する問題