gpt4 book ai didi

java - 使用 Logback 即时更改日志文件路径属性

转载 作者:行者123 更新时间:2023-11-30 05:54:49 26 4
gpt4 key购买 nike

如何在 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);
}

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

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);
}

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

最佳答案

我只是扩展 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] 来了解如何连接它。它应该比费力配置更容易。

关于java - 使用 Logback 即时更改日志文件路径属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8931986/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com