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文件:
(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