1. 程式人生 > >Java開發日誌分析工具Log4j使用詳解

Java開發日誌分析工具Log4j使用詳解

常用的日誌控制元件有commons-logging、Log4j以及JDK1.4自帶的Logging。

日誌簡介:

早期,java開發用System.out.println(),輸出到螢幕,但是這種輸出不可控制,日誌的可讀性差,而且輸出到螢幕需要消耗資源,大量的IO操作會使程式執行變慢。

JKD1.4自帶的Logging,從JDK1.4起,JDK開始自帶一套日誌系統。JDK Logging最大的優點是不需要任何類庫的支援,只要java執行環境就可以執行。但是相對於其他日誌控制元件,JDK自帶的控制元件無論是易用性、功能還是擴充套件型都不如其他的好用,基本上不適用。

Log4j控制元件,目前使用最廣泛的日誌控制元件,它把日誌分為ALL、TRACE、DEBUG、INFO、WARN、ERROR、FITAL、OFF(由低到高)。

ALL 是最低等級的,用於開啟所有日誌記錄。

DEBUG 指出細粒度資訊事件對除錯應用程式是非常有幫助的。

INFO 表明 訊息在粗粒度級別上突出強調應用程式的執行過程。 

WARN 表明會出現潛在錯誤的情形。

ERROR 指出雖然發生錯誤事件,但仍然不影響系統的繼續執行。

FATAL 指出每個嚴重的錯誤事件將會導致應用程式的退出。

OFF 是最高等級的,用於關閉所有日誌記錄。 

commons-logging控制元件,是apache commons類庫中的一員,Apache類庫是一個通用的類庫,提供了基礎的功能,例如commons-fileupload,commons-httpclient,commons-io,commons-codec等。commons-logging不是一個日誌控制元件,沒有日誌功能,它只是統一了JDK Logging與Log4j的API,並把日誌功能交給JDK Logging或者Log4j。對於不能確定日誌方式的系統,commons-logging是個不錯的選擇。Spring、Hibernate、Struts等都使用的是commons-logging。

第一、Logger.getLogger()和LogFactory.getLog()的區別
    1.Logger.getLogger()是使用log4j的方式記錄日誌;

    2.LogFactory.getLog()則來自apache的common-logging包。

common-logging元件: 
       Jakarta Commons Logging (JCL)提供的是一個日誌(Log)介面(interface),同時兼顧輕量級和不依賴於具體的日誌實現工具。它提供給中介軟體/日誌工具開發者一個簡單的日誌操作抽象,允許程式開發人員使用不同的具體日誌實現工具。瞭解包裡情況,可以檢視它的API文件:

http://www.oschina.net/uploads/doc/commons-logging-1.1.1/index.html , 其中Log(基本記錄器)和LogFactory(負責建立Log例項)是兩個基類。該API直接提供對下列底層日誌記錄工具的支援:Jdk14Logger,Log4JLogger,LogKitLogger,NoOpLogger (直接丟棄所有日誌資訊),還有一個SimpleLog。 有必要詳細說明一下呼叫LogFactory.getLog()時發生的事情。呼叫該函式會啟動一個發現過程,即找出必需的底層日誌記錄功能的實現,具體的發現過程在下面列出:  ( 換句話說就是, 有這麼多工具,common-logging該使用哪一個呢?這取決於系統的設定,common-logging將按以下順序決定使用哪個日誌記錄工具:)

        (1).common-logging首先在CLASSPATH中查詢commons-logging.properties檔案。這個屬性檔案至少定義org.apache.commons.logging.Log屬性,它的值應該是上述任意Log介面實現的完整限定名稱。如果找到 org.apache.commons.logging.Log屬相,則使用該屬相對應的日誌元件。結束髮現過程。

        (2).如果上面的步驟失敗(檔案不存在或屬相不存在),common-logging接著檢查系統屬性org.apache.commons.logging.Log。如果找到org.apache.commons.logging.Log系統屬性,則使用該系統屬性對應的日誌元件。結束髮現過程。
        (3).如果找不到org.apache.commons.logging.Log系統屬性,common-logging接著在CLASSPATH中尋找log4j的類。如果找到了就假定應用要使用的是log4j。不過這時log4j本身的屬性仍要通過log4j.properties檔案正確配置。結束髮現過程。
        (4).如果上述查詢均不能找到適當的Logging API,但應用程式正執行在JRE 1.4或更高版本上,則預設使用JRE 1.4的日誌記錄功能。結束髮現過程。
        (5).最後,如果上述操作都失敗(JRE 版本也低於1.4),則應用將使用內建的SimpleLog。SimpleLog把所有日誌資訊直接輸出到System.err。結束髮現過程。

        為了簡化配置 commons-logging ,一般不使用 commons-logging 的配置檔案,也不設定與 commons-logging 相關的系統環境變數,而只需將 Log4j 的 Jar 包放置到 classpash 中就可以了。這樣就很簡單地完成了 commons-logging 與 Log4j 的融合。

        根據不同的性質,日誌資訊通常被分成不同的級別,從低到高依次是:“除錯( DEBUG )”“資訊( INFO )”“警告( WARN )”“錯誤(ERROR )”“致命錯誤( FATAL )”。

   舉例說明:

   基於common-logging的執行方式:

package org; 
import org.apache.commons.logging.Log; 
import org.apache.log4j.Logger; 
public class Test extends TagSupport{ 
public static Log log=LogFactory.getLog(Test.class); 
public static void test() 
{ 
log.debug("111"); 
log.info("125"); 
log.warn("485"); 
log.error("error"); 

} 
public static void main(String[] a) 
{ 
Test.test(); 
} 
} 

基於log4j的執行方式
import org.apache.log4j.Logger; 
import org.apache.log4j.PropertyConfigurator; 
public class TestLog4j { 


static Logger logger = Logger.getLogger(TestLog4j.class); 
   public static void main(String args[]) { 
   PropertyConfigurator.configure("log4j.properties"); 
   logger.debug("Here is some DEBUG"); 
   logger.info("Here is some INFO"); 
      logger.warn("Here is some WARN"); 
      logger.error("Here is some ERROR"); 
      logger.fatal("Here is some FATAL"); 
   } 
}

第二、詳細介紹Log4j

    Log4j的架構 
   Log4j系統的三大板塊:日誌寫入器、日誌輸出終端、日誌佈局模式


        Logger類是日誌包的核心,Logger的名稱是大小寫敏感的,並且名稱之間有繼承關係。子名由父名做字首,用點號“.”分隔,如x.y是x.y.z的父親Logger。Logger系統中有個根logger,是所有logger的祖先,它總是存在的,並且不可以通過名字獲取,可以通過Logger.getRootLogger()來獲取。獲取Logger物件的方法很多,可以參考API文件,在某物件中,用該物件所屬的類作為引數,呼叫Logger.getLogger(Class clazz)以獲取logger物件被認為是目前所知最理智的命名logger方法。

   ②Log4j的日誌級別(Level) 
       每個logger都有一個日誌級別,用來控制日誌的輸出。未分配級別的logger將自動繼承它最近的父logger的日誌級別。Logger的由低到高級別如下: 
     ALL<DEBUG<INFO<WARN<ERROR<FATAL<OFF

   ③Log4j的輸出終端(Appender介面) 

Log4j提供了以下幾個實現:

org.apache.log4j.ConsoleAppender(控制檯)   
org.apache.log4j.FileAppender(檔案)   
org.apache.log4j.DailyRollingFileAppender(每天都產生一個日誌檔案)   
org.apache.log4j.RollingFileAppender(檔案大小達到指定尺寸時產生一個新的日誌檔案,檔名稱上會自動新增數字序號。)   
org.apache.log4j.WriterAppender(將日誌資訊以流的格式傳送到任意指定的地方)  


 預設情況下,子logger將繼承父logger的所有appenders。

    Log4j的輸出佈局模式(Layout介面)  
      Log4j提供Layout有以下幾種:

org.apache.log4j.HTMLLayout(以HTML表格形式佈局)   
org.apache.log4j.PatternLayout(可以靈活地指定佈局模式)   
org.apache.log4j.SimpleLayout(包含日誌資訊的級別和資訊字串)   
org.apache.log4j.TTCCLayout(包含日誌產生的時間、執行緒、類別等資訊)  


 Log4j採用類似C語言中的printf函式的列印格式格式化日誌資訊。列印引數如下:
%m:輸出程式碼中指定的訊息。   
%p:輸出優先順序。   
%r:輸入自應用啟動到輸出該log資訊耗費的毫秒數。   
%c:輸出所屬的類目,通常就是所在類的全名。   
%t:輸出產生該日誌執行緒的執行緒名。   
%n:輸出一個回車換行符。Windows平臺為“\r\n”,UNIX為“\n”。   
%d:輸出日誌時間點的日期或時間,預設格式為ISO8601,推薦使用“%d{ABSOLUTE}”,這個輸出格式形如:“2007-05-07 18:23:23,500”,符合中國人習慣。   
%l:輸出日誌事件發生的位置,包括類名、執行緒名,以及所在程式碼的行數。  


   Log4j的配置

在實際使用中,Log4j一般是通過配置檔案配置使用的。配置檔案有兩種,Java properties和XML檔案。一般都選用properties檔案來配置,因為簡潔易讀。下面只介紹Java properties的配置方式。 
對Log4j的配置就是對rootLogger和子Logger的配置。主要的配置項為:rootLogger、輸出終端、輸出佈局模式,所有的配置項都必須以log4j開頭。 
    配置檔案的示例

##Log4J的配置之簡單使它遍及於越來越多的應用中了   
  
##Log4J配置檔案實現了輸出到控制檯、檔案、回滾檔案、傳送日誌郵件、輸出到資料庫日誌表、自定義標籤等全套功能。擇其一二使用就夠用了。   
  
##此檔案(log4j.properties)內容來自網路,非本文作者liigo原創。   
log4j.rootLogger = DEBUG, CONSOLE,A1   
log4j.addivity.org.apache = true  
  
# 應用於控制檯   
log4j.appender.CONSOLE = org.apache.log4j.ConsoleAppender   
log4j.appender.Threshold = DEBUG   
log4j.appender.CONSOLE.Target = System.out   
log4j.appender.CONSOLE.layout = org.apache.log4j.PatternLayout   
log4j.appender.CONSOLE.layout.ConversionPattern = [framework] % d - % c -%- 4r [ % t] %- 5p % c % x - % m % n   
#log4j.appender.CONSOLE.layout.ConversionPattern = [start] % d {DATE} [DATE] % n % p[PRIORITY] % n % x[NDC] % n % t[THREAD] n % c[CATEGORY] % n % m[MESSAGE] % n % n   
  
#應用於檔案   
log4j.appender.FILE = org.apache.log4j.FileAppender   
log4j.appender.FILE.File = file.log   
log4j.appender.FILE.Append = false  
log4j.appender.FILE.layout = org.apache.log4j.PatternLayout   
log4j.appender.FILE.layout.ConversionPattern = [framework] % d - % c -%- 4r [ % t] %- 5p % c % x - % m % n   
# Use this layout for LogFactor 5 analysis   
  
# 應用於檔案回滾   
log4j.appender.ROLLING_FILE = org.apache.log4j.RollingFileAppender   
log4j.appender.ROLLING_FILE.Threshold = ERROR   
log4j.appender.ROLLING_FILE.File = rolling.log   
log4j.appender.ROLLING_FILE.Append = true  
log4j.appender.ROLLING_FILE.MaxFileSize = 10KB   
log4j.appender.ROLLING_FILE.MaxBackupIndex = 1  
log4j.appender.ROLLING_FILE.layout = org.apache.log4j.PatternLayout   
log4j.appender.ROLLING_FILE.layout.ConversionPattern = [framework] % d - % c -%- 4r [ % t] %- 5p % c % x - % m % n   
  
#應用於socket   
log4j.appender.SOCKET = org.apache.log4j.RollingFileAppender   
log4j.appender.SOCKET.RemoteHost = localhost   
log4j.appender.SOCKET.Port = 5001  
log4j.appender.SOCKET.LocationInfo = true  
# Set up for Log Facter 5  
log4j.appender.SOCKET.layout = org.apache.log4j.PatternLayout   
log4j.appender.SOCET.layout.ConversionPattern = [start] % d {DATE} [DATE] % n % p[PRIORITY] % n % x[NDC] % n % t[THREAD] % n % c[CATEGORY] % n % m[MESSAGE] % n % n   
  
# Log Factor 5 Appender   
log4j.appender.LF5_APPENDER = org.apache.log4j.lf5.LF5Appender   
log4j.appender.LF5_APPENDER.MaxNumberOfRecords = 2000  
  
# 傳送日誌給郵件   
log4j.appender.MAIL = org.apache.log4j.net.SMTPAppender   
log4j.appender.MAIL.Threshold = FATA   
log4j.appender.MAIL.BufferSize = 10  
log4j.appender.MAIL.From = [email protected]   
log4j.appender.MAIL.SMTPHost = www.wusetu.com   
log4j.appender.MAIL.Subject = Log4J Message   
log4j.appender.MAIL.To = [email protected]   
log4j.appender.MAIL.layout = org.apache.log4j.PatternLayout   
log4j.appender.MAIL.layout.ConversionPattern = [framework] % d - % c -%- 4r [ % t] %- 5p % c % x - % m % n   
  
  
# 用於資料庫   
log4j.appender.DATABASE = org.apache.log4j.jdbc.JDBCAppender   
log4j.appender.DATABASE.URL = jdbc:mysql: // localhost:3306/test   
log4j.appender.DATABASE.driver = com.mysql.jdbc.Driver   
log4j.appender.DATABASE.user = root   
log4j.appender.DATABASE.password =   
log4j.appender.DATABASE.sql = INSERT INTO LOG4J (Message) VALUES ( ' [framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n ' )   
log4j.appender.DATABASE.layout = org.apache.log4j.PatternLayout   
log4j.appender.DATABASE.layout.ConversionPattern = [framework] % d - % c -%- 4r [ % t] %- 5p % c % x - % m % n   
log4j.appender.A1 = org.apache.log4j.DailyRollingFileAppender   
log4j.appender.A1.File = SampleMessages.log4j   
log4j.appender.A1.DatePattern = yyyyMMdd - HH ' .log4j '  
log4j.appender.A1.layout = org.apache.log4j.xml.XMLLayout   
  
#自定義Appender   
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender   
log4j.appender.im.host = mail.cybercorlin.net   
log4j.appender.im.username = username   
log4j.appender.im.password = password   
log4j.appender.im.recipient = [email protected]   
log4j.appender.im.layout = org.apache.log4j.PatternLayout   
log4j.appender.im.layout.ConversionPattern = [framework] % d - % c -%- 4r [ % t] %- 5p % c % x - % m % n   
  
# 結束  

Log4j控制元件:

Log4j的執行效率,Log4j只在初始化的時候開啟檔案,並保持對檔案的寫控制,直到在系統結束的時候才關閉檔案。這樣就是IO次數達到最小,提高效率。

Log4j.properties配置檔案,預設的配置檔案為log4j.properties。啟動時會載入classpath下的log4j.properties初始化Log4j。如果檔案不存在,Log4j會在控制檯列印沒有找到Log4j配置。如果不適用預設的檔名log4j.properties,可以使用PropertyConfigurator指定配置檔案的路徑。

log4j.properties配置檔案:

log4j.xml配置檔案:

日誌記錄器Logger:

負責記錄日誌。

輸出地Appender:

負責輸出到什麼地方。

輸出格式Layout:

負責以什麼格式輸出,輸出哪些附加資訊。

當使用.class獲取logger物件的時候,檢視當前類所處的路徑可用如下方法,當時servlet類時候,log4j相對應的是tomcat的路徑,產生的日誌檔案也是相對tomcat路徑進行存放的

new File("").getAbsolutePath();

PS:內容來自資料的搜尋總結,謝謝提供資料的網友

相關推薦

Java開發日誌分析工具Log4j使用

常用的日誌控制元件有commons-logging、Log4j以及JDK1.4自帶的Logging。 日誌簡介: 早期,java開發用System.out.println(),輸出到螢幕,但是這種輸出不可控制,日誌的可讀性差,而且輸出到螢幕需要消耗資源,大量的IO操作會使程

Java定時任務排程工具Timer

做專案很多時候會用到定時任務,比如在深夜,流量較小的時候,做一些統計工作。早上定時傳送郵件,更新資料庫等。 這裡可以用Java的Timer或執行緒池實現。 Timer可以實現,不過Timer存在一些問題。他起一個單執行緒,如果有異常產生,執行緒將退出,整個定時任務就失敗。 Timer

nginx伺服器access_log日誌分析及配置

nginx的log日誌分為access log 和 error log 其中access log 記錄了哪些使用者,哪些頁面以及使用者瀏覽器、ip和其他的訪問資訊 error log 則是記錄伺服器錯誤日誌 錯誤日誌的形式如下: 201.158.69.116 -

Linux自帶 Logrotate 日誌切割工具配置

多少 日誌丟失 logger 管理工具 utm 拷貝 刪除 code 系統 Logrotate 程序是一個日誌文件管理工具。用於分割日誌文件,壓縮轉存、刪除舊的日誌文件,並創建新的日誌文件,下面就對logrotate日誌輪轉的記錄: 1.1 Logrotate配置文件介紹

常用開發庫 - MapStruct工具

常用開發庫 - MapStruct工具庫詳解 MapStruct是一款非常實用Java工具,主要用於解決物件之間的拷貝問題,比如PO/DTO/VO/QueryParam之間的轉換問題。區別於BeanUtils這種通過反射,它通過編譯器編譯生成常規方法,將可以很大程度上提升效率。@pdai 為什麼會引入Ma

關於U盤序列號讀取工具分析

步驟 data size HR http set 而已 system 狀態 今天看到了一篇非常有意思的文章,個人覺得寫的屬實不錯,就拿來分享給大家一下。 原文如下: 我相信各位玩黑的朋友們都會很害怕一件事吧!那就是有一個別有用心的人把U盤插到了自己電腦上~該怎麽樣敏銳的

Java】HashMap源碼分析——常用方法

fir 設置 直接 dfa 構造方法 change mage null 這也 上一篇介紹了HashMap的基本概念,這一篇著重介紹HasHMap中的一些常用方法:put()get()**resize()** 首先介紹resize()這個方法,在我看來這是HashMap中一個

Java併發工具

在JDK的併發包裡提供了幾個非常有用的併發工具類。CountDownLatch、CyclicBarrier和Semaphore工具類提供了一種併發流程控制的手段,Exchanger工具類則提供了線上程間交換資料的一種手段。本章會配合一些應用場景來介紹如何使用這些工具類。 等待多執行緒完成的Cou

Java反編譯工具Jad

做專案過程中需要反編譯一個jar包,於是作了一些學習,記錄下來。 Jad(JAva Decompiler)是一個Java的反編譯器,可以通過命令列把Java的class檔案反編譯成原始碼。 如果你在使用編寫程式碼的時候遇到找不到原始碼的第三方庫,而且你又需要看看這個庫的具體實現,那麼你就需要使用

Java定時任務Timer排程器【一】 原始碼分析(圖文版)

就以鬧鐘的例子開頭吧(後續小節皆以鬧鐘為例,所有原始碼只列關鍵部分)。 public class ScheduleDemo { public static void main(String[] args) throws InterruptedException {

Java】HashMap原始碼分析——常用方法

上一篇介紹了HashMap的基本概念,這一篇著重介紹HasHMap中的一些常用方法:put()get()**resize()** 首先介紹resize()這個方法,在我看來這是HashMap中一個非常重要的方法,是用來調整HashMap中table的容量的,在很多操作中多需要重新計算容量。原始碼如下: 1

ELK日誌監控分析系統Logstash之——output模組

摘要: Logstash的output模組,相比於input模組來說是一個輸出模組,output模組集成了大量的輸出外掛,可以輸出到指定檔案,也可輸出到指定的網路埠,當然也可以輸出資料到ES.在這裡我只介紹如何輸出到ES,至於如何輸出到埠和指定檔案,有很多的文件資料可查詢. Logs

ELK日誌監控分析系統Logstash之——input模組

摘要: Logstash由三個元件構造成,分別是input、filter以及output。我們可以吧Logstash三個元件的工作流理解為:input收集資料,filter處理資料,output輸出資料。至於怎麼收集、去哪收集、怎麼處理、處理什麼、怎麼發生以及傳送到哪等等一些列的問題就是我

ELK日誌監控分析系統Logstash之——filter模組

摘要: Logstash三個元件的第二個元件,也是真個Logstash工具中最複雜,最蛋疼的一個元件,當然,也是最有作用的一個元件。 1、grok外掛 grok外掛有非常強大的功能,他能匹配一切資料,但是他的效能和對資源的損耗同樣讓人詬病。 Logstash三個元件的第二個元件,也是

Java效能分析神器-JProfiler(一)(轉)

前段時間在給公司專案做效能分析,從簡單的分析Log(GC log, postgrep log, hibernate statitistic),到通過AOP蒐集軟體執行資料,再到PET測試,感覺時間花了不少,效能也有一定的提升,但總感覺像是工作在原始時代,無法簡單順暢,又無比清

[轉]log4j日誌資訊配置檔案

使用log4j 記錄日誌甚是方便,其提供了兩種日誌配置方式,log4j.propertes和log4j.xml,這篇檔案先貼出log4j.properties配置方式 1、log4j.properties檔案配置簡析 下面給出了log4j.properties檔案常用的一

Java基礎】Jar包結構結構分析和操作

一 JAR包結構分析 JAR(Java Archive FIle)Java歸檔檔案,是Java標準的文件格式,是一個或多個Java位元組碼檔案的打包壓縮檔案,採用常見的ZIP壓縮演算法,和ZIP檔案十分類似,可以直接解壓。 JAR檔案主要用來壓縮和釋

java:陣列操作工具java.util.Arrays包 主要方法

轉載自:https://www.cnblogs.com/dengyungao/p/7525067.html java:陣列操作工具類 java.util.Arrays包 主要方法詳解 Arrays類位於Java.util包下,是一個對陣列操作的工具類,現將Arrays類中的方法做一個總結(J

(二)U-boot在開發板上移植過程--bootloader架構分析

 本例中採用的同樣是前邊一貫的實驗板,這裡就不對板子資源做進一步介紹了。     我們知道,bootloader是系統上電後最初載入執行的程式碼。它提供了處理器上電覆位後最開始需要執行的初始化程式碼。在PC機上載入程式一般由BIOS開始執行,然後讀取硬碟中位於MBR(Main Boot Record,主引

log4j 將指定日誌輸出到不同的檔案中

import org.apache.log4j.Logger; <span style="font-family: Arial, Helvetica, sans-serif;">public class HelloWorld {</span> <span style="whit