1. 程式人生 > >Log4J日誌配置詳解和自定義log4j日誌級別及輸出日誌到不同檔案實現方法

Log4J日誌配置詳解和自定義log4j日誌級別及輸出日誌到不同檔案實現方法

package com.jo.work.log4j;

import java.util.Enumeration;

import org.apache.log4j.Appender;
import org.apache.log4j.FileAppender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.RollingFileAppender;
import org.apache.log4j.net.SyslogAppender;
/**
 * 自定義日誌級別和 
 */
public class CustomLog {
	private static CustomLog log = new CustomLog();
    private CustomLog(){}
    public static CustomLog getInstance() {  
    	return log;  
    } 
	/** 
     * 繼承Level自定義級別
     */ 
	private static class CustomLogLevel extends Level{
		private static final long serialVersionUID = 1L;
		protected CustomLogLevel(int level, String levelStr, int syslogEquivalent) {
			super(level, levelStr, syslogEquivalent);
		}
	}
	/** 
     * 自定義級別名稱,以及級別範圍 
     */  
    private static final Level CustomerLevel = new CustomLogLevel(20050, "CUSTOMER", SyslogAppender.LOG_LOCAL0);  
    
    /** 
     * 生成日誌物件
     * @param filePath 日誌輸出路徑
	 * @param fileName 日誌檔名
	 * @param conversionPattern log的輸出形式  
	 * @param flag true:在已存在log檔案後面追加 false:新log覆蓋以前的log
     */  
    public Logger createLogger(String filePath, String fileName, String conversionPattern, boolean flag){
    	// 生成新的Logger  
        // 如果已經有了一個Logger例項則返回  
        Logger logger = Logger.getLogger(fileName); 
        // 清空Appender。特別是不想使用現存例項時一定要初期化  
        logger.removeAllAppenders();  
        // 設計定Logger級別。  
        logger.setLevel(Level.DEBUG);  
        // 設定是否繼承父Logger。  
        // 預設為true。繼承root輸出。  
        // 設定false後將不輸出root。  
        logger.setAdditivity(false);  
        // 生成新的Appender  
        FileAppender appender = new RollingFileAppender();  
        // log的輸出形式  
        PatternLayout layout = new PatternLayout();   
        layout.setConversionPattern(conversionPattern+"%m%n");  
        appender.setLayout(layout);  
        // log輸出路徑    
        appender.setFile(filePath+ fileName + ".log");  
        // log的文字碼  
        appender.setEncoding("UTF-8");  
        // true:在已存在log檔案後面追加 false:新log覆蓋以前的log  
        appender.setAppend(flag);  
        // 適用當前配置  
        appender.activateOptions();  
        // 將新的Appender加到Logger中  
        logger.addAppender(appender);
        
        return logger;
    }
    /** 
     * 使用自定義日誌列印logger中的log方法
     * @param logger 日誌物件
	 * @param objLogInfo:日誌內容
     */  
    public void customLog(Logger logger, Object objLogInfo){
    	logger.log(CustomerLevel, objLogInfo);  
    }
    /**
     * 關閉自定義log
     * @param logger 日誌物件
     */
    @SuppressWarnings("unchecked")
	public void closeCustomLog(Logger logger){
    	for (Enumeration<Appender> appenders=logger.getAllAppenders(); appenders.hasMoreElements();) {
	        Appender appender=appenders.nextElement();
		appender.close();
	}
    }
}
測試: