1、log4j日誌框架的理論和不一樣場景使用

一、日誌框架:
  工做中要進行Java輸出日誌時,你須要一個或者多個日誌框架。框架能提供對象、方法和必要的配置來發送日誌信息。Java語言自己有自帶的日誌實現包java.util.logging。還有不少第三方的日誌框架,包括log4j、log4j 二、logback。sl4j和Apache Commons Logging提供了日誌的抽象層次,經過它能夠從底層的日誌框架實現解耦合,從而在不一樣的日誌框架間切換。關於sl4j和logback的日誌學習和使用能夠參看好朋友的博文(https://fengmengzhao.github.io/2018/06/12/detailed-explanation-of-java-logging-framework.html)。本篇旨在讓你可以輕鬆使用log4j日誌框架。html

二、log4j日誌框架
  Log4j API設計爲分層結構,其中每一層提供了不一樣的對象,對象執行不一樣的任務。這使得設計靈活,根據未來須要來擴展。Log4j的框架的核心對象即爲log4j的核心組件。
Log4j框架的主要學習其:核心對象、支持對象、配置、支持的功能實現。
2.1 Log4j框架對象
2.1.1核心對象: 框架的強制對象和框架的使用,包括:
1)Logger對象:頂級層的Logger,它提供Logger對象。Logger對象負責捕獲日誌信息及它們存儲在一個空間的層次結構。
2)LayOut佈局對象:該層提供其用於格式化不一樣風格的日誌信息的對象。佈局層提供支持Appender對象到發佈日誌信息以前。
咱們使用的PatternLayout 使用 appender。全部可能的選項有:
•    DateLayout
•    HTMLLayout
•    PatternLayout
•    SimpleLayout
•    XMLLayout
使用HTMLLayout和XMLLayout,能夠在HTML和XML格式和生成日誌。java

--HTMLLayout佈局對象
若是想生成一個HTML格式的文件,日誌信息,那麼可使用 org.apache.log4j.HTMLLayout 格式化日誌信息。HTMLLayout類擴展抽象org.apache.log4j.Layout類,並覆蓋其基類的 format()方法來提供HTML樣式格式。其提供瞭如下信息顯示:
  •    生成特定的日誌事件以前,從應用程序的開始所通過的時間
  •    調用該記錄請求的線程的名稱
  •    與此記錄請求相關聯的級別
  •    日誌記錄器(Logger)和記錄消息的名稱
  •    可選程序文件的位置信息,並從其中記錄被調用的行號
HTMLLayout是一個很是簡單的佈局對象,它提供如下方法:git

setContentType(String)
設置 text/html 爲 HTML內容的內容類型。默認爲 text/html

setLocationInfo(String)
設置位置信息記錄事件。默認爲 false

setTitle(String)
設置爲HTML文件的標題。默認值是Log4j的日誌信息
View Code

簡單示例:github

log4j.properties文件:
# Define the root logger with appender file
log = D\://ceshiZJB/learnLogs/log4-demo
log4j.rootLogger = DEBUG, FILE

# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log}/htmlLayout.html

# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.HTMLLayout
log4j.appender.FILE.layout.Title=HTML Layout Example
log4j.appender.FILE.layout.LocationInfo=true
View Code
import java.io.*;
import java.sql.SQLException;

import org.apache.log4j.Logger;

public class log4jExample{
  /* Get actual class name to be printed on */
  static Logger log = Logger.getLogger(
                      log4jExample.class.getName());

  public static void main(String[] args)
                throws IOException,SQLException{
   
     log.debug("Hello this is an debug message");
     log.info("Hello this is an info message");
  }
}
View Code

備註:一個具備HTML格式的日誌文件的一大優點是,它能夠被髮布爲網頁能夠遠程查看。
--PatternLayout佈局對象
若是想生成基於模式的特定格式的日誌信息,那麼可使用 org.apache.log4j.PatternLayout 格式化日誌信息。
PatternLayout類擴展抽象 org.apache.log4j.Layout 類並覆蓋format()方法根據提供的模式構建日誌信息。
PatternLayout也是一個簡單的佈局對象,它提供conversionPattern屬性(設置轉換模式。默認爲 %r [%t] %p %c %x - %m%n),能夠經過配置文件進行設置。
參看文章地址:https://www.yiibai.com/log4j/log4j_patternlayout.html
3)Appender對象:下位層提供Appender對象,Appender對象負責打印日誌信息到不一樣的目的地,如控制檯,文件,sockets,NT事件日誌,數據庫等,能夠經過包括如下方法的配置文件,設置一個 Appender 對象添加到記錄器:sql

方法1:log4j.logger.[logger-name]=level, appender1,appender..n
方法2:能夠編寫以XML格式相同的結構以下:
<logger name="com.apress.logging.log4j" additivity="false">
   <appender-ref ref="appender1"/>
   <appender-ref ref="appender2"/>
</logger>
方法3:若是想要添加Appender對象到程序,那麼可使用下面的方法:
public void addAppender(Appender appender);
addAppender()方法添加一個appender到Logger對象。做爲示例配置演示,能夠添加不少Appender對象到記錄器在逗號分隔的列表,每一個打印日誌信息分離目的地。
View Code

日誌追加到一個文件中:即寫日誌信息到一個文件中,必須使用org.apache.log4j.FileAppender。有如下FileAppender的配置參數:數據庫

immediateFlushapache

標誌的默認設置爲true,這意味着輸出流的文件被刷新,在每一個追加操做緩存

encodingapp

它可使用任何字符編碼。默認狀況下是特定於平臺的編碼方案框架

threshold

這個 appender 閾值級別

Filename

日誌文件的名稱

fileAppend

默認設置爲true,這意味着記錄的信息被附加到同一文件的末尾

bufferedIO

此標誌表示是否須要寫入緩存啓用。默認設置爲false

bufferSize

若是 bufferedI/O 啓用,這表示緩衝區的大小,默認設置爲8KB

日誌追加到多個文件中:當想生成每一天的日誌文件,以保持日誌記錄信息的良好記錄。日誌記錄信息歸入平常的基礎文件,就必須它擴展FileAppender類,並繼承其全部屬性useorg.apache.log4j.DailyRollingFileAppender類。除了如上所述屬性,FileAppender還有一個重要的配置參數:DatePattern (這表示在滾動的文件,並按命名慣例來執行。默認狀況下,在天天午夜滾動)
DatePattern控制使用下列滾動的時間表方式之一:

DatePattern

描述

'.' yyyy-MM

滾動在每月的結束和下一個月初

'.' yyyy-MM-dd

這是默認值,天天午夜滾動

'.' yyyy-MM-dd-a

滾動每一天的午夜和中午

'.' yyyy-MM-dd-HH

滾動在每個小時

'.' yyyy-MM-dd-HH-mm

滾動在每個分鐘

'.' yyyy-ww

滾動每一個星期取決於區域設置時的第一天

簡單示例:

# Define the root logger with appender file
log = D\://ceshiZJB/learnLogs/log4-demo
# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE

# Define the file appender
log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender
# Set the name of the file
log4j.appender.FILE.File=${log}/log.out

# Set the immediate flush to true (default)
log4j.appender.FILE.ImmediateFlush=true

# Set the threshold to debug mode
log4j.appender.FILE.Threshold=debug

# Set the append to false, should not overwrite
log4j.appender.FILE.Append=true

# Set the DatePattern
log4j.appender.FILE.DatePattern='.' yyyy-MM-dd-HH-mm

# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n
View Code
public class log4jExample{
 /* 每分鐘生成日誌文件
  * */
 static Logger log = Logger.getLogger(
                      log4jExample.class.getName());
  static Object obj =new Object();

  public static void main(String[] args)
                throws IOException,SQLException, InterruptedException{
      
      synchronized (obj) {
          for(int i=0;i<350;i++){
              obj.wait(1000L);
                 log.debug("Hello this is an debug message"+i);
                 //log.info("Hello this is an info message");
          }
    }
      
  }
}
View Code

日誌存放到數據庫中
參看文章地址:https://www.yiibai.com/log4j/log4j_logging_database.html#article-start

2.1.2支持對象:可選的對象執行另外重要的任務,log4j框架的其餘重要的對象(支持對象)起到日誌框架的一個重要做用。包括:
1)Level對象:Level對象(級別對象)用來定義任何記錄信息的粒度和優先級。有記錄的七個級別在API中定義:OFF, DEBUG, INFO, ERROR, WARN, FATAL 和 ALL
使用DEBUG兩個追加程序。全部可能的選項有:org.apache.log4j.Level類提供如下級別,但也能夠經過Level類的子類自定義級別。

Level

描述

ALL

各級包括自定義級別

DEBUG

指定細粒度信息事件是最有用的應用程序調試

ERROR

錯誤事件可能仍然容許應用程序繼續運行

FATAL

指定很是嚴重的錯誤事件,這可能致使應用程序停止

INFO

指定可以突出在粗粒度級別的應用程序運行狀況的信息的消息

OFF

這是最高等級,爲了關閉日誌記錄

TRACE

指定細粒度比DEBUG更低的信息事件

WARN

指定具備潛在危害的狀況


2)Filter過濾對象用於分析日誌信息及是否應記錄或是否須要根據這些信息作出進一步的決定。
  一個appender對象能夠有與之關聯的幾個Filter對象。如:日誌記錄信息傳遞給特定Appender對象,經由 Filter對象批准後的日誌信息,而後才能發佈到所鏈接的目的地。

方法1:
private static org.apache.log4j.Logger log = Logger.getLogger(LogClass.class);
      log.setLevel(Level.WARN);
方法2:
# Define the root logger with appender file
log = /usr/home/log4j
log4j.rootLogger = WARN, FILE

# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log}/log.out

# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n
View Code

3)ObjectRenderer(對象渲染器)
  ObjectRenderer對象是一個指定提供傳遞到日誌框架的不一樣對象的字符串表示。這個對象所使用的佈局對象來準備最後的日誌信息。
4)日誌管理對象:管理日誌框架。它負責從一個系統級的配置文件或配置類讀取初始配置參數。

上述全部學習資料的來源均轉自:https://www.yiibai.com/log4j/

學習源碼和筆記可在百度網盤進行下載:https://pan.baidu.com/s/1QZ57clyQYUIOBQ5M12vIcg  pg1y

相關文章
相關標籤/搜索