Java 使用Logback动态更改日志文件路径属性
如何在Logback中动态更改日志文件路径 在“我的web应用程序”中,用户可以更改保存和处理某些电子邮件附件的位置。用户可以访问此路径,并查看处理后是否发生了一些错误,因此我想在此路径中创建一个日志文件。为了实现这一点,我尝试使用此Logback配置:Java 使用Logback动态更改日志文件路径属性,java,logging,logback,Java,Logging,Logback,如何在Logback中动态更改日志文件路径 在“我的web应用程序”中,用户可以更改保存和处理某些电子邮件附件的位置。用户可以访问此路径,并查看处理后是否发生了一些错误,因此我想在此路径中创建一个日志文件。为了实现这一点,我尝试使用此Logback配置: <configuration debug="true" scan="true" scanPeriod="30 seconds"> <property scope="context" resource="com/hrgi
<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>
因此,我尝试删除记录器appender并创建一个新的记录器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);
}
有人能解释一下我做错了什么吗?我要扩展
ch.qos.logback.core.rolling.TimeBasedRollingPolicy
并将其传递给RollingFileAppender
appender似乎可以将其用作触发和滚动策略。只要在每次配置发生更改时执行滚动
,并根据您的配置返回下一个文件名即可。
您应该查看方法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]想知道如何把它连接起来。这应该比在配置上挣扎要容易。我认为您可能要寻找的是
SiftingAppender用于根据给定的运行时属性通过根据需要动态创建appender来分离(或筛选)日志记录。它在运行时根据MDC中设置的值将日志条目写入不同的文件。谢谢Peter,我已经扩展了TimeBasedRollingPolicy,并重写了rollover和isTriggeringEvent,现在我可以手动更改日志文件路径。。。
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);
}