Java程序运行时,动态修改Logger的appender。
在程序运行的时候,有的时候需要动态修改Logger的级别,增加、删除、修改Logger的Appender。
Java代码如下:
import java.io.IOException;
import java.nio.charset.Charset;
import org.slf4j.LoggerFactory;
import org.testng.annotations.Test;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.core.FileAppender;
/**
* Log修改管理
*
* @author bash
* @version V1.0
* @since 2016-03-21 10:53
*/
public class LoggerDynamicConfig {
/**
* 日志记录Logger
*/
private static final Logger LOG = (Logger) LoggerFactory.getLogger(LoggerDynamicConfig.class);
@Test
public void addAppender() throws IOException {
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
/*这里配置encodeer。*/
PatternLayoutEncoder encoder = new PatternLayoutEncoder();
encoder.setCharset(Charset.forName("UTF-8"));
encoder.setPattern("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n");
encoder.setImmediateFlush(true);
encoder.setContext(lc);
/*这里启配置appender*/
FileAppender appender = new FileAppender();
appender.setEncoder(encoder);
appender.setFile("/home/bash/workspace/temp/test.log");
appender.setName("TestFile");
appender.setAppend(false);
appender.setContext(lc);
/*这里启动encoder和appender。*/
encoder.start();
appender.start();
LOG.addAppender(appender);
LOG.info("这里时一条所有appender都可以输出的数据。");
/*修改Logger级别*/
LOG.setLevel(Level.ERROR);
LOG.info("这里的数据所有appender都不会输出。");
LOG.error("这里时一条所有appender都可以输出的数据。");
/*删除appender*/
LOG.detachAppender("TestFile");
LOG.error("这条数据不会在FileAppender中输出。");
}
}
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="STDOUT"/>
</root>
</configuration>