log4j配置详解及日志等级设置
官方網址:?http://logging.apache.org/log4j/1.2/
參考:http://blog.csdn.net/maxracer/article/details/7920997
log4j是apache基金會的一個項目,日志記錄器(Logger)是日志處理的核心組件,log4j具有7種級別(Level).
DEBUG Level: 指出細粒度信息事件對調試應用程序是非常有幫助的,就是輸出debug的信息.
INFO level: 表明消息在粗粒度級別上突出強調應用程序的運行過程,就是輸出提示信息.
WARN level: 表明會出現潛在錯誤的情形,就是顯示警告信息.
ERROR level: 指出雖然發生錯誤事件,但仍然不影響系統的繼續運行.就是顯示錯誤信息.
FATAL level: 指出每個嚴重的錯誤事件將會導致應用程序的退出.
ALL level: 是最低等級的,用于打開所有日志記錄.
OFF level: 是最高等級的,用于關閉所有日志記錄.
一共分為五個級別:DEBUG、INFO、WARN、ERROR和FATAL。這五個級別是有順序的,DEBUG < INFO < WARN < ERROR < FATAL,明白這一點很重要,這里Log4j有一個規則:假設設置了級別為P,如果發生了一個級別Q比P高,則可以啟動,否則屏蔽掉。
DEBUG: 這個級別最低的東東,一般的來說,在系統實際運行過程中,一般都是不輸出的。因此這個級別的信息,可以隨意的使用,任何覺得有利于在調試時更詳細的了解系統運行狀態的東東,比如變量的值等等,都輸出來看看也無妨。
INFO:這個應該用來反饋系統的當前狀態給最終用戶的,所以,在這里輸出的信息,應該對最終用戶具有實際意義,也就是最終用戶要能夠看得明白是什么意思才行。從某種角度上說,Info 輸出的信息可以看作是軟件產品的一部分(就像那些交互界面上的文字一樣),所以需要謹慎對待,不可隨便。
WARN、ERROR和FATAL:警告、錯誤、嚴重錯誤,這三者應該都在系統運行時檢測到了一個不正常的狀態,他們之間的區別,要區分還真不是那么簡單的事情。我大致是這樣區分的:
所謂警告,應該是這個時候進行一些修復性的工作,應該還可以把系統恢復到正常狀態中來,系統應該可以繼續運行下去。
所謂錯誤,就是說可以進行一些修復性的工作,但無法確定系統會正常的工作下去,系統在以后的某個階段,很可能會因為當前的這個問題,導致一個無法修復的錯誤(例如宕機),但也可能一直工作到停止也不出現嚴重問題。
所謂Fatal,那就是相當嚴重的了,可以肯定這種錯誤已經無法修復,并且如果系統繼續運行下去的話,可以肯定必然會越來越亂。這時候采取的最好的措施不是試圖將系統狀態恢復到正常,而是盡可能地保留系統有效數據并停止運行。
也就是說,選擇 Warn、Error、Fatal 中的具體哪一個,是根據當前的這個問題對以后可能產生的影響而定的,如果對以后基本沒什么影響,則警告之,如果肯定是以后要出嚴重問題的了,則Fatal之,拿不準會怎么樣,則 Error 之。
log4j建議只使用五個級別,級別順序(由低到高): DEBUG < INFO < WARN < ERROR < FATAL
windows下控制臺效率比較差,輸出的多了,非常影響服務器性能.
調試程序用debug或更低的優先級,這樣開發的時候可以盡量輸出,方便調試.
正式部署之后,可以提高日志的級別,只輸出關鍵信息.
日志記錄器(Logger)的行為是分等級的。如下表所示:
分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、ALL或者您定義的級別。Log4j建議只使用四個級別,優先級從高到低分別是ERROR、WARN、INFO、DEBUG。通過在這里定義的級別,您可以控制到應用程序中相應級別的日志信息的開關。比如在這里定義了INFO級別,則應用程序中所有DEBUG級別的日志信息將不被打印出來。程序會打印高于或等于所設置級別的日志,設置的日志等級越高,打印出來的日志就越少。如果設置級別為INFO,則優先級高于等于INFO級別(如:INFO、WARN、ERROR)的日志信息將可以被輸出,小于該級別的如DEBUG將不會被輸出。
參考2:http://blog.sina.com.cn/s/blog_7de0b6230100tfy8.html
1.1相關英文詳解
?log:日志??debug:調試 error:錯誤 warn:警告, 提醒 info:消息
1.2 什么是log4j?為什么要有log4j?
?log4j定義:log4j是一個流行、優秀的日志記錄工具,它能夠以各種靈活的方法輸出日志信息;
?為什么要用log4j:在程序發生錯誤時,我們希望可以以文件的形式保存這此異常信息,以便日后查看處理優化程序,
?就可以用到日志記錄,現流行最優秀的一款:log4j,它是開源的,且方便易用;
1.3如何使用log4j記錄程序發后的異常日志信息?
????(1). 下載log4j的jar包.????log4j-1.2.15.jar
????(2). 請將jar包粘貼到工程中.
????(3). 導入jar包:工程名,右鍵--properties--java build path--libraries--add jars……
?????????第二步可以不執行,在第三步中工程名,右鍵--properties--java build path--libraries--add External jars……即可
?? 區別:add jars……是添加工程內jar包,add External jars……則不限制于包內,用于jar包未放置于工程內;
?? 建議執行第二步,實現工程、jar包一體化,避免出現未知的異常
????(4). 新建一個log4j.properties:src--右鍵--new--file--命名log4j.properties
????(5). 配置log4j.properties:
?### 設置優先級別、以及輸出源 stdout輸出到控制臺,file保存到文件###
? log4j.rootLogger=debug, stdout, file
? ### 把日志信息輸出到控制臺 ###
? log4j.appender.stdout=org.apache.log4j.ConsoleAppender
? log4j.appender.stdout.Target=System.out
? log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
? log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %l %m%n
? ### 把日志信息輸出到文件:accp.log ###
? log4j.appender.file=org.apache.log4j.FileAppender
? log4j.appender.file.File=accp.log
? log4j.appender.file.layout=org.apache.log4j.PatternLayout
? log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}??%l??%m%n
????(6).詳解配置:
? log4j.appender.stdout=org.apache.log4j.ConsoleAppender:添加到控制臺?
? log4j.appender.stdout.Target=System.out:方式為輸出??
? log4j.appender.stdout.layout=org.apache.log4j.PatternLayout:信息布局方式為自定義
? log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %l %m%n
? 布局方式:布局方式:yyyy-年mm-月dd-天hh-小時mm-分鐘ss-秒鐘 %l:具體異常代碼行數%m:異常信息%n:信息換行
????(7)優先級:??
????????優先級從高到低分別是ERROR、WARN、INFO、DEBUG
????(8).總結:
? a:配置文件中不能包含中文(注釋中文也不可),因為配置文件保存標準為:"ISO-8859-1";
? b:log4j.rootLogger=debug, stdout, file中的debug可替換為ERROR、WARN、INFO、DEBUG?
? c:根據需求設置級別,如設置為debug,則會忽略比它級別低的所有異常
? d:log4j.rootLogger=debug, stdout, file中的stdout, file可選其一
1.4實例說明:
?需求:需求:計算類(compute)要求用戶輸入二個數執行相除并保存結果用異常類進行處理和使用log4j記錄異常信息
代碼實現:
package com.t97.compute;
import java.util.InputMismatchException;
import java.util.Scanner;
import org.apache.log4j.Logger;//導入log4j包
public class Compute {
?// 聲明數組
?private int[] num = new int[2];
?// 封裝屬性
?public int[] getNum() {
??return num;
?}
?public void setNum(int[] num) {
??this.num = num;
?}
?
?public static void main(String[] args) {
??Scanner input = new Scanner(System.in);
??Compute compute = new Compute();
??Logger log = Logger.getLogger(Compute.class);
??int result = 0;
??int[] num = compute.getNum();
??String answer = null;
??try {
???System.out.println("請輸入第一個數字:");
???num[0] = input.nextInt();
???System.out.println("請輸入第二個數字:");
???num[1] = input.nextInt();
???result = num[0] / num[1];
???System.out.println("是否保存結果?(y/n)");
???answer = input.next();
???if (answer.equalsIgnoreCase("y")) {
????num[2] = result;// 試圖將計算結果保存到數組中
???}
??} catch (InputMismatchException e) {
???System.out.println("用戶輸入數據類型錯誤!");
???log.debug("用戶輸入數據類型錯誤!");
??} catch (ArithmeticException ae) {
???System.out.println("發生算術錯誤!" + ae.getMessage());
???log.info("發生算術錯誤!" + ae.getMessage());
??} catch (ArrayIndexOutOfBoundsException aee) {
???System.out.println("數組發生越界!");
???log.warn(aee);
??} catch (Exception exception) {
???System.out.println("程序發生異常,給您帶來不便,請重新啟動!");
???log.error(exception);
??} finally {
???System.out.println(num[0] + "除以" + num[1] + "的計算結果為:" + result);
??}
?}
}
1.4.1日志分析:
預記錄一:用戶輸入的不是數字時,InputMismatchException捕獲到異常,結束程序,輸出提示:用戶輸入數據類型錯誤!
log.debug("用戶輸入數據類型錯誤!"),記錄錯誤信息:
2009-09-28 11:36:23 com.t97.compute.Compute.main(Compute.java:46)??用戶輸入數據類型錯誤!
預記錄二: 用戶輸入的第二個數即除數為0時,ArithmeticException捕獲到異常,結束程序,輸出提示:發生算術錯誤!/ by zero
?log.info("發生算術錯誤!" + ae.getMessage()),記錄錯誤信息:
2009-09-28 11:35:00 com.t97.compute.Compute.main(Compute.java:49)?java.lang.ArithmeticException: / by zero
預 記錄三:程序提示:"是否保存結果?(y/n)",如果輸入"Y"后,ArrayIndexOutOfBoundsException捕獲到異常,結束程 序,輸出提示:數組發生越界因為數據長度為2,而程序試圖"num[2] = result;// 試圖將計算結果保存到數組中",發生越界!
??????????log.warn(aee), 記錄錯誤信息:
2009-09-28 11:37:41 com.t97.compute.Compute.main(Compute.java:52)?java.lang.ArrayIndexOutOfBoundsException: 2
預記錄四:未知錯誤,Exception超類捕獲到異常,結束程序,輸出提示"程序發生異常,給您帶來不便,請重新啟動!"
??????????log.error(exception),記錄錯誤信息:(未知的……)
總結
以上是生活随笔為你收集整理的log4j配置详解及日志等级设置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: numpy 学习汇总15 -广播 ( 基
- 下一篇: 降压高效DC-DC4.5V至60V宽范围