Изменение свойства пути файла журнала на лету с Logback - PullRequest
2 голосов
/ 19 января 2012

Как я могу изменить путь к файлу журнала на лету в 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);
}

Может кто-нибудь объяснить мне, что я делаю не так?

Ответы [ 2 ]

3 голосов
/ 30 января 2012

Я думаю, что вы можете искать SiftingAppender .

SiftingAppender используется для разделения (или просеивания) ведения журнала в соответствии с заданным атрибутом времени выполнения путем динамического создания дополнительных объектов по мере необходимости. Он записывает записи журнала в разные файлы на основе значения, установленного в MDC во время выполнения.

3 голосов
/ 24 января 2012

Я бы просто расширил 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], чтобы понять, как его подключить.Это должно быть проще, чем бороться с конфигурацией.

...