java log4j日誌熱配置

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文件
    }
}


我這邊的輸出結果是有變化的


按鈕的效果



發佈了59 篇原創文章 · 獲贊 13 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章