1. 程式人生 > >(轉)log4j(二)——如何控制日誌信息的輸出?

(轉)log4j(二)——如何控制日誌信息的輸出?

應用程序 asi 是不是 開始 fat warn exce per 狀態

一:測試環境與log4j(一)——為什麽要使用log4j?一樣,這裏不再重述

1 先看栗子再來下結論

import org.apache.log4j.*;
import test.log4j.bean.Person;
//by godtrue
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(); /** * 使用自定義的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個字符,那麽從開始截斷。 *
*/ //試驗,並查看日誌格式化後的效果 //String pattern = "[1]%t - [2]%p - [3]%r - [4]%c - [5]%F - [6]%d - [7]%L - [8]%l - [9]%% - [10]%M - [11]%m[12]%n"; //運行程序看看,是不是我們期待的日誌輸出樣子 //試驗,並查看日誌格式化後的效果 String pattern = "[1]%-10p - [2]%10p - [3]%.3p - [4]%-10.3p - [5]%10.3p 。 %n"; //運行程序看看,是不是我們期待的日誌輸出樣子
/** * 二:定義日誌輸出的風格樣式,日誌輸出的風格主要有以下幾種(通過官方文檔我們會發現還有其他的): * 1)org.apache.log4j.HTMLLayout(以HTML表格形式布局), * 2)org.apache.log4j.PatternLayout(可以靈活地指定布局模式,這個在我的實際工作中是最常用的), * 3)org.apache.log4j.SimpleLayout(包含日誌信息的級別和信息字符串), * 4)org.apache.log4j.TTCCLayout(包含日誌產生的時間、線程、類別等等信息) */ Layout layout = new PatternLayout(pattern); /** * 三:定義日誌輸出的目的地,日誌輸出的目的地主要中以下幾種(通過官方文檔我們會發現還有好多種類的): * 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(將日誌信息以流格式發送到任意指定的地方) */ Appender appender= new ConsoleAppender(layout); //配置日誌輸出的定義,主要有三點:1:輸出什麽級別的日誌信息,2:將日誌信息輸出到那裏,3:輸出的日誌以什麽格式展示 BasicConfigurator.configure(appender); /** * 日誌輸出的級別,主要有以下幾種: * 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 */ 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));//打印程序運行的時間 } }

運行結果:

技術分享

ps:

String pattern = "[1]%-10p - [2]%10p - [3]%.3p  - [4]%-10.3p - [5]%10.3p 。 %n"; //運行程序看看,是不是我們期待的日誌輸出樣子
對於上述日誌樣式中的[4] [5] 當日誌內容發生截取時候,就不會實現左右對齊補充空格的樣式;

例如String pattern = "[1]%-10p - [2]%10p - [3]%.3p - [4]%-10.3p - [5]%10.4p 。 %n"; //運行程序看看,是不是我們期待的日誌輸出樣子

技術分享

當設置最大長度為4時候,沒有發生截取的字符串會按照對齊的方式自動對齊。

2 結論

1)如果將上述代碼中的註釋全部去掉,你會發現這段代碼其實是相當的簡單的,註釋是試驗的時候添加上的,也是我想記住的知識點,它們就是使用log4j框架控制日誌輸出的方式了

2)上面的代碼有以下幾部分構成

2-1)控制日誌信息輸出格式的——pattern

2-2)控制日誌信息輸出樣式的——layout

2-3)控制日誌信息輸出目的地的——appender

2-4)控制日誌信息輸出的——LOGGER,他可以調用不同級別的日誌輸出方法,然後根據配置的日誌輸出級別來控制什麽方法會被調用,這個後面會再次講到的

3)無論是通過配置文件控制,還是通過程序本身控制,我們想控制的基本是 2) 所描述的這些部分,這些功能也是一個日誌框架提供的最基本的功能

(轉)log4j(二)——如何控制日誌信息的輸出?