Log4j
概述
Log4j 是一個使用 Java 語言編寫的,可靠、快速、靈活的日志框架(API)垢袱,使用 Apache Software License 授權。
它被移植到 C港柜、C++请契、C#、Perl夏醉、Python爽锥、Ruby 和 Eiffel 語言中。Log4j 是高度可配置的畔柔,在運行期使用外部的配置文件對其進行配置氯夷。它按照優(yōu)先級別記錄日志,并可將日志信息定向輸出到各種介質靶擦,比如數(shù)據(jù)庫腮考、文件雇毫、控制臺、Unix Syslog等踩蔚。
Log4j的歷史
始于 1996 年棚放,作為記錄E.U. SEMPER (Secure Electronic Marketplace for Europe)項目跟蹤信息的 API。
經(jīng)過大量的完善和蛻變寂纪,最初的 API 終于演進為 Log4j席吴,一個在 Java 社區(qū)流行的日志類庫赌结。該類庫使用 Apache Software License 授權捞蛋,該授權是經(jīng)開源促進協(xié)會認證的、完整的開源協(xié)議柬姚。
最新版本的 Log4j拟杉,連同其代碼、類文件和文檔可通過 http://logging.apache.org/log4j/ 獲取量承。
Log4j的功能
- 線程安全搬设。
- 速度優(yōu)化。
- 基于命名的 logger 層次撕捍。
- 每個 logger 支持多種輸出 appender拿穴。
- 支持國際化。不受限于預定義好的設施忧风。
- 日志記錄行為可在運行期通過配置文件設置默色。
- 設計之初就考慮了處理 Java 異常。
- 使用多個日志級別:ALL狮腿、TRACE腿宰、DEBUG、INFO缘厢、WARN吃度、ERROR、FATAL贴硫。
- 通過擴展 Layout 類可輕松改變輸出日志的格式椿每。
- 輸出日志的目的和策略可通過實現(xiàn) Appender 接口改變。
- 失敗即停止英遭。雖然 Log4j 努力做到最好拖刃,但不保證每一條日志都能發(fā)送到指定目的地。
架構
Log4j API 采用分層架構贪绘,每一層有不同的對象兑牡,完成不同的任務。這種分層架構讓設計變得靈活税灌,且易于日后擴展均函。
Log4j 里分兩種類型的對象
- 核心對象:這是框架必需的對象亿虽,使用框架時必需用到它們。
- 支持對象:這是框架的可選對象苞也,它們支持核心對象做一些額外的洛勉,但并不重要的任務。
核心對象
核心對象包括以下三種類型:
Logger對象
Logger對象位于最上一層如迟,該對象負責獲取日志信息收毫,并存儲于一個分層的命名空間之中。
Appender對象
該對象位于分層架構中的較低一層殷勘,Appender 對象負責將日志信息發(fā)布到不同目的地此再,比如數(shù)據(jù)庫、文件玲销、控制臺输拇、Unix Syslog 等
Layout對象
Layout層提供了用于格式化日志信息的對象,在發(fā)布日志信息之前贤斜,它為 appender 對象提供支持策吠。
支持對象
- Level 對象:定義了日志信息的粒度和優(yōu)先級。API 定義了七種級別:OFF瘩绒、DEBUG猴抹、INFO、ERROR锁荔、WARN蟀给、FATAL、ALL堕战。
- Filter對象:用于分析日志信息坤溃,進而決定該條日志是否被記錄。
一個 Appender 對象可對應多個 Filter 對象嘱丢,當日志信息傳給 Appender 對象時薪介,與其關聯(lián)的所有 Filter 對象需要判斷是否將日志信息發(fā)布到目的地。
- ObjectRenderer對象:負責為傳入日志框架的不同對象提供字符串形式的表示越驻,Layout 對象使用該對象來準備最終的日志信息汁政。
- LogManager對象:管理日志框架,它負責從系統(tǒng)級的配置文件或類中讀取初始配置參數(shù)缀旁。
Appender是Log4j里面最核心最重要的類记劈,Apache Log4j 提供的 Appender 對象主要負責將日志信息打印至不同目的地,比如控制臺并巍、文件目木、網(wǎng)絡套接字、NT 事件日志等懊渡。每個Appender對象都有不同的屬性刽射,這些屬性決定了該對象的行為军拟。
屬性 | 描述 |
---|---|
layout | Appender 使用 Layout 對象和與之關聯(lián)的模式來格式化日志信息 |
target | 目的地可以是控制臺、文件誓禁,或依賴于 appender 的對象懈息。 |
level | 級別用來控制過濾日志信息。 |
threshold | Appender 可脫離于日志級別定義一個閥值級別摹恰,Appender 對象會忽略所有級別低于閥值級別的日志辫继。 |
filter | 對象可在級別基礎之上分析日志信息,來決定 Appender 對象是否處理或忽略一條日志記錄俗慈。通過在配置文件中使用如下方法姑宽,將 Appender 對象添加至 Logger 對 |
實例
配置需求
- 定義根日志級別為 DEBUG,并將名為 FILE 的 appender 添加其上姜盈。
- appender FILE 定義為 org.apache.Log4j.FileAppender低千,它將日志寫入 log 目錄下一個名為 log.out 的文件中配阵。
- layout 被定義為 %m%n馏颂,即打印出來的日志信息末尾加入換行。
Log4j 支持 Unix 風格的變量替換棋傍,比如 ${variableName}
配置文件
Log4j.propertis文件內(nèi)容
# Define the root logger with appender file
log=/user/document/log
Log4j.rootLogger = DEBUG, FILE
Log4j.appender.FILE=org.apache.Log4j.FileAppender
Log4j.appener.FILE.File= ${log}/log.out
Log4j.appender.FILE.layout=org.apache.Log4j.PatternLayout
Log4j.appender.FILE.layout.conversionPattern=%m%n
通過XML配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE Log4j:configuration SYSTEM "Log4j.dtd">
<Log4j:configuration>
<appender name="FILE" class="org.apache.Log4j.FileAppender">
<param name="file" value="${log}/log.out"/>
<layout class="org.apache.Log4j.PatternLayout">
<param name="conversionPattern" value="%m%n"/>
</layout>
</appender>
<logger name="Log4j.rootLogger" additivity="false">
<level value="DEBUG"/>
<paaender-ref ref="FILE"/>
</logger>
</log4j:configuration>
Loging方法
Logger 類提供了很多方法用來處理日志救拉,Logger 類不允許初始化一個新的實例,但提供了兩個靜態(tài)方法用來獲取 Logger 對象:
- public static Logger getRootLogger();
- public static Logger getLogger(String name);
第一個方法返回應用實例沒有名字的根日志瘫拣。
其他有名字的 Logger 對象通過傳入日志的名字亿絮,調用第二個方法獲得。日志的名字是傳入的任何字符串麸拄,通常為類名或包名派昧。
附錄
以上為筆記主要記錄點,很多東西沒有提及拢切,詳細文檔信息等進入Log4j官網(wǎng)獲取.
PatternLayout
- 模式轉換字符
- 格式修飾符
參考極客學院有關Log4j資料整理所得蒂萎。