log4j日志热配置有两种,
一种是定时开线程去扫描日志文件有没有变化
另一种是用事件去触发日志文件的变化
log4j本身都支持这两种
下面就把我写的代码贴上
---------------------------------------------------------------------
java project
文件结构
Log4jTimerUpdate.java
这个是定时更新配置文件,也就是程序会自动扫描log4j配置文件
package com.demo;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
/**
* 动态修改log4j文件中的配置(日志输出级别), 就可以动态改变输出的情况
* 1.运行程序
* 2.观察日志变化
* 3.改变log4j.properties文件的日志级别
* 4.观察日志变化(根据配置的文件间隔,过了时间间隔后,日志输出会改变)
* @author chenlong3
*
*/
public class Log4jTimerUpdate {
private static Logger logger = Logger.getLogger(Log4jTimerUpdate.class);
static
{
//这行代码会定期扫描log4j配置文件,前面是文件地址,后面是定期扫描的时间,单位毫秒
PropertyConfigurator.configureAndWatch("src/log4j.properties", 3000);
}
/**
* @param args
*/
public static void main(String[] args) {
Log4jTimerUpdate helloLog4j = new Log4jTimerUpdate();
Log4jThread t = helloLog4j.new Log4jThread();
t.start();
}
class Log4jThread extends Thread{
@Override
public void run() {
while(true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 记录debug级别的信息
logger.error("---------------------");
logger.debug("debug message.");
// 记录info级别的信息
logger.info("info message.");
// 记录error级别的信息
logger.error("error message.");
logger.error("---------------------");
}
}
}
}
下面是property形式的配置文件
log4j.properties
#debug, info, error
log4j.rootLogger=debug,appender1
#log4j.rootLogger=info,appender1
#log4j.rootLogger=error,appender1
log4j.appender.appender1=org.apache.log4j.ConsoleAppender
log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout
下面是用时间触发的,我写了一个jframe中的按钮来触发
Log4jTriggerUpdate.java
package com.demo;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
/**
* 时间触发更新日志文件的级别
* 1.运行main方法
* 2.观察打印日志
* 3.修改log4j.properties的日志级别,
* 4.观察打印日志(日志输出未发生变化)
* 5.点击jframe中的更新配置文件按钮
* 6.观察打印日志(日志输出发生了变化)
* @author chenlong3
*
*/
public class Log4jTriggerUpdate extends JFrame{
private static final long serialVersionUID = 1L;
private static Logger logger = Logger.getLogger(Log4jTriggerUpdate.class);
private static String filePath = "src/log4j.properties";
/**
* 构造方法中创建jframe,生成按钮,执行时间触发
* web中可以直接调用方法reloadLog4jConfig()触发更新配置文件
*/
public Log4jTriggerUpdate(){
this.setSize(200, 200);
JButton jbutton = new JButton("更新配置文件");
jbutton.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent arg0)
{
reloadLog4jConfig();
}
});
this.add(jbutton);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
/**
* @param args
*/
public static void main(String[] args) {
Log4jTriggerUpdate test = new Log4jTriggerUpdate();
Log4jThread t = test.new Log4jThread();
t.start();
}
class Log4jThread extends Thread {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 记录debug级别的信息
logger.error("---------------------");
logger.debug("debug message.");
// 记录info级别的信息
logger.info("info message.");
// 记录error级别的信息
logger.error("error message.");
logger.error("---------------------");
}
}
}
private void reloadLog4jConfig() {
// DOMConfigurator.configure(filePath);// 加载文件xml
PropertyConfigurator.configureAndWatch(filePath);//property文件
}
}
我这边的输出结果是有变化的
按钮的效果