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文件
}
}
我這邊的輸出結果是有變化的
按鈕的效果