有时我们需要在logback中做一些动态配置,比如日志等级、输出路径等,这些信息可以存放在数据库中,启动时加载,可以用logback自带的contextListener。
<?xml version="1.0" encoding="UTF-8" ?>
<configuration debug="true" scan="true" scanPeriod="60 seconds">
<contextListener class="com.midea.jr.credit.accounting.utils.LoggerStartupListener" />
</configuration>
以上配置代表logback每隔60秒扫描logback.xml的更改,并将改动加载到系统,实现动态配置。
并在初始化之前,启动监听:LoggerStartupListener
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.spi.LoggerContextListener;
import ch.qos.logback.core.Context;
import ch.qos.logback.core.spi.ContextAwareBase;
import ch.qos.logback.core.spi.LifeCycle;
public class LoggerStartupListener extends ContextAwareBase implements LoggerContextListener, LifeCycle {
private static final String DEFAULT_LOG_FILE = "MYAPP";
private boolean started = false;
@Override
public void start() {
if( started )
return;
String userHome = System.getProperty( "user.home" );
String logFile = System.getProperty( "log.file" ); // log.file is our custom jvm parameter to change log file name dynamicly if needed
logFile = ( logFile != null && logFile.length() > 0 ) ? logFile : DEFAULT_LOG_FILE;
Context context = getContext();
context.putProperty( "MY_HOME", userHome );
context.putProperty( "LOG_FILE", logFile );
started = true;
}
@Override
public void stop() {}
@Override
public boolean isStarted() {
return started;
}
@Override
public boolean isResetResistant() {
return true;
}
@Override
public void onStart( LoggerContext context ) {}
@Override
public void onReset( LoggerContext context ) {}
@Override
public void onStop( LoggerContext context ) {}
@Override
public void onLevelChange( Logger logger, Level level ) {}
}
则变量可配置到logback.xml中:
<appender name="ROOT"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${MY_HOME}/root.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<FileNamePattern>${MY_HOME}/root.log.%i.bak</FileNamePattern>
<MinIndex>1</MinIndex>
<MaxIndex>12</MaxIndex>
</rollingPolicy>
<triggeringPolicy
class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>100MB</MaxFileSize>
</triggeringPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
</layout>
</appender>