java log4j日志热配置

来源:互联网 发布:软件测试的出路 编辑:程序博客网 时间:2024/05/29 03:15

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


我这边的输出结果是有变化的


按钮的效果



0 0