1. 程式人生 > >(一)log4j框架入門介紹與使用

(一)log4j框架入門介紹與使用

一.日誌框架的作用

      使用日誌框架的好處顯而易見,方便、自在、功能強大能夠滿足各種需求,不好的地方也是有的,比如:如果你也進行了試驗你會發現,程式變慢了,需要一定的時間和精力作為學習的成本。

      能夠控制日誌資訊想往哪裡打就往哪裡打,比如:控制檯、檔案、郵箱、資料庫等等

      能夠控制日誌資訊想怎麼打就怎麼打,比如:我想要列印時間、程式的名稱、程式的方法名、程式的行號、執行緒的名稱等等

      能夠控制日誌資訊想打什麼打什麼,不想打的就不打,日誌資訊是分級別的,有時候我只想看錯誤的資訊或者警告的資訊,有時候我想看到所有的資訊我想除錯程式等等

      監視程式碼中變數的變化情況,週期性的記錄到檔案中供其他應用進行統計分析工作;

      跟蹤程式碼執行時軌跡,作為日後審計的依據;

      擔當整合開發環境中的偵錯程式的作用,向檔案或控制檯列印程式碼的除錯資訊。

二.log4j介紹

       log4j是Apache的一個開放原始碼的專案,通過使用log4j,我們可以控制日誌資訊輸送的目的地是控制檯、檔案、GUI元件、甚至是套介面伺服器、NT的事件記錄器、UNIX Syslog守護程序等;我們也可以控制每一條日誌的輸出格式;通過定義每一條日誌資訊的級別,我們能夠更加細緻地控制日誌的生成過程。最令人感興趣的就是,這些可以通過一個配置檔案來靈活地進行配置,而不需要修改應用的程式碼。

      此外,通過log4j其他的語言介面,您可以在C、C++、.Net、PL/SQL程式中使用log4j,其語法和用法與在Java程式中一樣,使得多語言分散式系統得到一個統一一致的日誌元件模組。而且,通過使用各種第三方擴充套件,您可以很方便地將Log4j整合到J2EE、JINI甚至是SNMP應用中。

三.log4j的環境配置

 一:定義日誌資訊的格式化方式

Log4J採用類似C語言中的printf函式的列印格式格式化日誌資訊,列印引數如下:
         1)%t 用來輸出生成該日誌事件的執行緒的名稱
         2)%p 用於輸出日誌事件的優先順序,即DEBUG,INFO,WARN,ERROR,FATAL
         3)%r 用於輸出從layout(佈局)的構建到日誌事件建立所經過的毫秒數
         4)%c 用於輸出日誌事件的category(類別),通常就是所在類的全名
         5)%F 用於輸出被髮出日誌記錄請求,其中的檔名
         6)%d 用於輸出日誌時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:20017年02月18日 22:10:28,921
         7)%L 用於輸出日誌事件的發生位置,即在程式碼中的行數。舉例:10
         8)%l 用於輸出日誌事件的發生位置,包括類目名、發生的執行緒,以及在程式碼中的行數。舉例:Testlog4.main(TestLog4.java:10)
         9)%% 用於輸出%標誌
         10)%M 用於輸出列印該條日誌的方法名
         11)%m 用於輸出程式碼中指定的訊息
         12)%n 用於輸出一個回車換行符,Windows平臺為“rn”,Unix平臺為“n”
         
         
         當我們執行程式後發現,因為輸出的日誌資訊長短不一,所以對不齊,看起來不好看,那麼有什麼法子呢?log4j也發現這個問題,並且為我們提供了格式修飾符
         格式修飾符:可以控制輸出欄位的最小欄位寬度、最大欄位寬度、欄位對齊格式,如下所示:
         序號 格式修飾符    對齊方式       最小寬度            最大寬度            備註(對%c來使用格式修飾符,所以改變的是類別名稱)
         
         1)  %-20c        左對齊            20                none            用空格右墊,如果類別名稱少於20個字元長
         2)  %20c         右對齊            20                none            用空格左墊,如果類別名稱少於20個字元長
         3)  %.30c        左對齊            none              30              從開始截斷,如果類別名稱超過30個字元長
         4)  %-20.30c     左對齊            20                30              用空格右側墊,如果類別名稱短於20個字元。但是,如果類別名稱長度超過30個字元,那麼從開始截斷。
         5)  %20.30c         右對齊            20                30                用空格左側墊,如果類別名稱短於20個字元。但是,如果類別名稱長度超過30個字元,那麼從開始截斷。
二:定義日誌輸出的風格樣式

日誌輸出的風格主要有以下幾種(通過官方文件我們會發現還有其他的):
         1)org.apache.log4j.HTMLLayout(以HTML表格形式佈局),
         2)org.apache.log4j.PatternLayout(可以靈活地指定佈局模式,這個在我的實際工作中是最常用的),
         3)org.apache.log4j.SimpleLayout(包含日誌資訊的級別和資訊字串),
         4)org.apache.log4j.TTCCLayout(包含日誌產生的時間、執行緒、類別等等資訊)
三:定義日誌輸出的目的地,日誌輸出的目的地主要中以下幾種(通過官方文件我們會發現還有好多種類的):
         1)org.apache.log4j.ConsoleAppender(控制檯),
         2)org.apache.log4j.FileAppender(檔案),
         3)org.apache.log4j.DailyRollingFileAppender(每天產生一個日誌檔案),
         4)org.apache.log4j.RollingFileAppender(檔案大小到達指定尺寸的時候產生一個新的檔案,這個在我的實際工作中也是最常用的),
         5)org.apache.log4j.WriterAppender(將日誌資訊以流格式傳送到任意指定的地方)
  日誌輸出的級別,主要有以下幾種:
         1)ALL    各級包括自定義級別。
         2)TRACE    最詳細的資訊。一般這些資訊只記錄到日誌檔案中。自版本1.2.12[3]。
         3)DEBUG    流經系統的詳細資訊。一般這些資訊只記錄到日誌檔案中。
         4)INFO    令人感興趣的執行時事件(啟動/關閉)。一般這些資訊將立即呈現在狀態控制檯上,因而要保守使用,並保持到最低限度。
         5)WARN    使用已過時的API,API的濫用,潛在錯誤,其他不良的或意外的執行時的狀況(但不一定是錯誤的)。一般這些資訊將立即呈現在狀態控制檯上。
         6)ERROR    其他執行時錯誤或意外情況。一般這些資訊將立即呈現在狀態控制檯上。
         7)FATAL    導致應用程式提前終止的嚴重錯誤。一般這些資訊將立即呈現在狀態控制檯上。
         8)OFF    最高級別,用於關閉日誌記錄。
        
         日誌的級別之間的大小關係如右所示:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF

例子:

/**
  *控制日誌資訊輸出格式的——pattern

  *控制日誌資訊輸出樣式的——layout

  *控制日誌資訊輸出目的地的——appender

  *控制日誌資訊輸出的——LOGGER,他可以呼叫不同級別的日誌輸出方法
**/
public class UseLog4j {
    //日誌記錄器
    private static Logger LOGGER = LogManager.getLogger(UseLog4j.class);
    //迴圈次數
    private static long CYCLE = 102;
    //程式入口——主函式
    public static void main(String[]args){

        long startTime = System.currentTimeMillis();
        
        //一:定義日誌資訊的格式化方式
        String pattern = "[1]%-10p - [2]%10p - [3]%.3p  - [4]%-10.3p - [5]%10.3p 。 %n";
        //二:定義日誌輸出的風格樣式
        Layout layout = new PatternLayout(pattern);
        //三:定義日誌輸出的目的地
        Appender appender= new ConsoleAppender(layout);
        //配置日誌輸出的定義,主要有三點:1:輸出什麼級別的日誌資訊,2:將日誌資訊輸出到那裡,3:輸出的日誌以什麼格式展示
        BasicConfigurator.configure(appender);

        for(int i=0;i<CYCLE;i++){
            if(i<100){
                try{
                    LOGGER.info(new Person("godtrue",100/i,'M'));//列印物件的資訊
                }catch(Exception e){
                    LOGGER.error(i+"歲的小孩還不存在嘛!");//列印物件的資訊
                }finally{
                    LOGGER.warn("現在大部分人的年齡都在0到100歲之間的!");//列印物件的資訊
                }
            }else{
                LOGGER.info("我是一棵樹,我今年活了"+i+"歲!哈哈,我厲害吧!");//列印物件的資訊
            }
        }
        LOGGER.debug("此程式的執行時間是:"+(System.currentTimeMillis()-startTime));//列印程式執行的時間
    }
}

轉:https://www.cnblogs.com/godtrue/p/6442347.html