搜尋
首頁Javajava教程使用Log4j為專案配置日誌輸出應用詳解以及範例示範的實作分析

Log4j元件構成 

Log4j由三個重要的元件構成:

1.日誌資訊的優先權(Logger)

2.日誌資訊的輸出目的地(Appender)

3.日誌資訊的輸出格式( Layout)。

概要:

日誌資訊的優先順序從高到低有ERROR、WARN、 INFO、DEBUG,分別用來指定這條日誌資訊的重要性;

日誌訊息的輸出目的地指定了日誌將列印到控制台還是文件中;

而輸出格式則控制了日誌資訊的顯示內容。

Log4j介紹

  Log4j是Apache的一個開放原始碼項目,透過使用Log4j,我們可以控制日誌資訊傳送的目的地是控制台、檔案、GUI元件、甚至是套介面伺服器、NT的事件記錄器、 UNIX Syslog守護程序等;我們也可以控制每一條日誌的輸出格式,透過定義每一條日誌資訊的級別,我們能夠更加細緻地控制日誌的生成過程。 log4j-- log for java (java的日誌) .

Log4j下載位址: http://logging.apache.org/log4j/2.x/download.html

Log4j設定檔的格式

Log4j支援

Log4j設定檔的格式

Log4j支援兩種設定檔格式:

1. XML格式的檔案

2. properties格式的檔案

也可以完全不使用設定檔,而是在程式碼中配置Log4j環境。但是,使用設定檔將使您的應用程式更加靈活。

Log4j定義設定檔

1.設定根Logger

其語法為:

log4j.rootLogger = [ level ] , appenderName, appenderName, …

參數說明:  

level 是日誌記錄的優先順序,分為RALL或您定義的等級。

Off: 最高等級,用於關閉所有日誌記錄

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

Error: 指出雖然發生錯誤事件,但仍不影響系統的繼續運作。

Warn: 表明會出現潛在的錯誤情況

Info: 一般用在粗粒度級別上,強調應用程式的運行全程

Debug: 一般和在粗粒度級別上,強調應用程式的運行全程。

All: 最低等級,用於開啟所有日誌記錄。

Log4j建議只使用四個級別,優先權從高到低分別是ERROR、WARN、INFO、DEBUG。透過在這裡定義的級別,您可以控製到應用程式中相應級別的日誌資訊的開關。

appenderName就是指日誌資訊輸出到哪個地方,可以同時指定多個輸出目的地。

2.設定日誌資訊輸出目的地Appender

其語法為:

log4j.appender.appenderName = fully.qualified.name.of.appender.class  
log4j.appender.appenderName.option1 = value1  
...  
log4j.appender.appenderName.option = valueN

Log4j提供的appender有以下幾種:

  org.apache.log4j.ConsoleAppender(控制台)

  org.apache.log4j.ConsoleAppenderache(控制台)

〜 org. FileAppender(檔案)

  org.apache.log4j.DailyRollingFileAppender(每天產生一個日誌檔案)

  org.apache.log4j.RollingFileAppender(檔案大小到達指定尺寸的時候產生新檔案) (將日誌資訊以串流格式傳送至任意指定的地方)

 

3.設定日誌資訊的格式

語法為:

log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1 …
log4j.appender.appenderName.layout.option = valueN

Log4j提供的layout有以下幾種:
. .log4j.HTMLLayout(以HTML表格形式佈局),

  org.apache.log4j.PatternLayout(可以靈活地指定佈局模式),

  org.apache.log4j.SimpleLay ,

  org.apache.log4j.TTCCLayout(包含日誌產生的時間、線程、類別等等信息)

Log4J採用類似C語言中的printf函數的打印格式格式化日誌信息,打印參數如下:

% m 輸出程式碼中指定的訊息

%p 輸出優先權,即DEBUG,INFO,WARN,ERROR,FATAL   

%r 輸出自應用啟動到輸出該log資訊所耗費的毫秒數

%r 輸出自應用啟動到輸出該log資訊所耗費的毫秒數

%c

%目,通常是所在類別的全名

%t 輸出產生該日誌事件的執行緒名稱

%n 輸出一個回車換行符,Windows平台為「rn」,Unix平台為「n」  

%d 輸出日誌時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式,例如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10 :28,921   

%l 輸出日誌事件的發生位置,包括類別目名、發生的線程,以及在程式碼中的行數。舉例:Testlog4.main(TestLog4.java:10)

%x: 輸出和當前執行緒相關聯的NDC(嵌套診斷環境),尤其用到像java servlets這樣的多客戶多執行緒的應用中。

%%: 輸出一個」%」字元%F: 輸出日誌訊息產生時所在的檔案名稱

%L: 輸出程式碼中的行號

%m: 輸出程式碼中所指定的訊息,產生的日誌訊息

%n: 輸出一個回車換行符,Windows平台為”rn”,Unix平台為”n”輸出日誌資訊換行可以在%與模式字元之間加上修飾符來控制其最小寬度、最大寬度、和文字的對齊方式。 🎜

如:

1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。

2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,”-”号指定左对齐。

3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。

4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉。

log4j.xml的配置方式

View Code
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="appender1"
        class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="logfile08.html" />
        <param name="MaxFileSize" value="1MB" />
        <param name="MaxBackupIndex" value="5" />
        <layout class="org.apache.log4j.HTMLLayout">
        </layout>
    </appender>
    <root>
        <level value="debug" />
        <appender-ref ref="appender1" />
    </root>
</log4j:configuration>

代码中使用Log4j


  在程序中使用 Log4j之前,首先要将commons-logging.jar和logging-log4j-1.2.9.jar导入到classpath中,并将 log4j.properties放于src根目录中。 在类中使用log4j,首先声明一个静态变量 Logger logger=Logger.getLog("classname").现在就可以使用了。

用法如下:logger.debug("debug message")或者logger.info("info message").

1.得到记录器 

  使用Log4j,第一步就是获取日志记录器,这个记录器将负责控制日志信息。

其语法为:

  public static Logger getLogger( String name)

  通过指定的名字获得记录器,如果必要的话,则为这个名字创建一个新的记录器。Name一般取本类的名字,比如:

  static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )

 

2.读取配置文件 

  当获得了日志记录器之后,第二步将配置Log4j环境,其语法为:

  BasicConfigurator.configure (): 自动快速地使用缺省Log4j环境。

  PropertyConfigurator.configure ( String configFilename) :读取使用Java的特性文件编写的配置文件。

  DOMConfigurator.configure ( String filename ) :读取XML形式的配置文件。

 

3.插入记录信息(格式化日志信息) 

  当上两个必要步骤执行完毕,您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方,语法如下:

   Logger.debug ( Object message ) ;

   Logger.info ( Object message ) ;

   Logger.warn ( Object message ) ;

   Logger.error ( Object message ) ; 

 

程序演示

1.使用程序进行日志信息输出

package org.demo.log4j.dennisit;

 import java.io.IOException;

 import org.apache.commons.logging.impl.Log4JLogger;
 import org.apache.log4j.BasicConfigurator;
 import org.apache.log4j.FileAppender;
 import org.apache.log4j.Layout;
 import org.apache.log4j.Level;
 import org.apache.log4j.Logger;
 import org.apache.log4j.SimpleLayout;

 /**
  *
  *  @version : 1.1
  *  
  *  @author  : 苏若年    <a href="mailto:DennisIT@163.com">发送邮件</a>
  *    
  *  @since      : 1.0        创建时间:    2013-1-1        下午03:19:42
  *     
  *  @function: 通过代码将日志输出
  *
  */

 public class Log4jPrintByCode {

     private static Logger logger = Logger.getLogger(Log4jPrintByCode.class);

     private Layout layout = new SimpleLayout();
     private FileAppender fileAppender;

 
     //使用构造依赖,创建对象时初始化
     public Log4jPrintByCode(Layout layout, Level level,String distDir){

         BasicConfigurator.configure();        //使用默认的配置信息,不需要写log4j.properties

         try {
             init(layout,level, distDir);
         } catch (Exception e) {
             e.printStackTrace();
         }

     }

     
     public void init(Layout layout, Level level,String distDir) throws Exception{

         logger.setLevel(level);                //设置日志输出级别
         fileAppender = new FileAppender(layout,distDir,false);
         logger.addAppender(fileAppender);    //添加输出端

     }

     
     public static void main(String[] args) {

         SimpleLayout layout = new SimpleLayout();
         String logDir = "log4jcode.Log";
         Log4jPrintByCode log4jCode = new Log4jPrintByCode(layout,Level.INFO,logDir);

         
         //下面信息将被输出
         log4jCode.logger.info("log info print by log4j");
         log4jCode.logger.warn("log warn print by log4j");
         log4jCode.logger.error("log error print by log4j");

     }

 
     public Layout getLayout() {
         return layout;
     }

     public void setLayout(Layout layout) {
         this.layout = layout;
     }

     public FileAppender getFileAppender() {
         return fileAppender;
     }

     public void setFileAppender(FileAppender fileAppender) {
         this.fileAppender = fileAppender;
     }

     

 }

为了提高效率,我们可以在写日志前增加判断:

// 记录debug级别的信息
if (logger.isDebugEnabled()) {
    logger.debug("This is debug message from Dao.");
}
// 记录info级别的信息
if (logger.isInfoEnabled()) {
    logger.info("This is info message from Dao.");
}

如果这个类作为基类,如J2EE中的BaseDao、BaseAction、BaseService等等,则我们可以将各层的日志信息分类输出到各个文件。

2.Log4J将同一个日志信息输出到多个目的地

/* 创建数据库 */ 
create database db_log4j;
/* 切换数据库 */
use  db_log4j;
/* 日志信息表 */
create table tb_log(
    logId int not null auto_increment comment &#39;流水号&#39; ,
    createDate varchar(45) default null comment &#39;日志生成时间&#39; ,
    thread varchar(45) default null comment &#39;当前线程&#39;,
    level varchar(45) default null comment &#39;当前日志级别&#39; ,
    class varchar(45) default null comment &#39;生成日志的类&#39;,
    message varchar(245) default null comment &#39;日志具体信息&#39;,
    primary key(logId)
);

应用实例将日志信息同时输出到控制台,文件和数据库中.

创建数据库与 表

/* 创建数据库 */ 
create database db_log4j;
/* 切换数据库 */
use  db_log4j;
/* 日志信息表 */
create table tb_log(
    logId int not null auto_increment comment &#39;流水号&#39; ,
    createDate varchar(45) default null comment &#39;日志生成时间&#39; ,
    thread varchar(45) default null comment &#39;当前线程&#39;,
    level varchar(45) default null comment &#39;当前日志级别&#39; ,
    class varchar(45) default null comment &#39;生成日志的类&#39;,
    message varchar(245) default null comment &#39;日志具体信息&#39;,
    primary key(logId)
);

配置文件log4j.properties

#定义3个输出端
log4j.rootCategory=INFO,A1,A2,A3
#定义A1输出到控制器
log4j.appender.A1=org.apache.log4j.ConsoleAppender
#定义A1的布局模式为PaternLayout
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
# 定义A1的输出格式
log4j.appender.A1.layout.ConversionPattern=%4p [%t] (%F:%L) - %m%n
#定义A2输出到文件
log4j.appender.A2=org.apache.log4j.RollingFileAppender
#定义A2输出到哪个文件
log4j.appender.A2.File=./log/sysLog.log
#定义A2输出文件的最大长度
log4j.appender.A2.MaxFileSize = 1KB
#定义A2的备份文件数
log4j.appender.A2.MaxBackupIndex = 3
#定义A2的布局模式为PatternLayout
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
#定义A2的输出模式
log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n
#定义A3输出到数据库
log4j.appender.A3=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.A3.URL=jdbc:mysql://localhost:3306/db_log4j
log4j.appender.A3.driver=com.mysql.jdbc.Driver
log4j.appender.A3.user=root
log4j.appender.A3.password=root
#定义A3的布局和执行的SQL语句
log4j.appender.A3.layout=org.apache.log4j.PatternLayout
log4j.appender.A3.layout.ConversionPattern=INSERT INTO tb_log(createDate,thread,level,class,message) values(&#39;%d&#39;,&#39;%t&#39;,&#39;%-5p&#39;,&#39;%c&#39;,&#39;%m&#39;)

Java测试代码

package org.demo.log4j.dennisit;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
/**
 *
 *  @version : 1.1
 *  
 *  @author  : 苏若年    <a href="mailto:DennisIT@163.com">发送邮件</a>
 *    
 *  @since      : 1.0        创建时间:    2013-1-1        下午04:13:59
 *     
 *  @function: 通过配置文件控制日志信息输出到多个目的端
 *
 */
public class Log4jPrintByConfigure {

    private static Logger logger = Logger.getLogger(Log4jPrintByConfigure.class);

    public static void main(String[] args) throws Exception {
        //加载log配置文件log4j.properties
        PropertyConfigurator.configure("configure/log4j.properties");//文件存放在src同目录的configure文件夹下

        //如果放在src下的话,参数应为"bin/log4j.properties"或者"src/log4j.properties", 建议以bin为准

        //以下信息将被打印输出
        logger.debug("logger print DEBUG messgae");
        logger.info("logger print INFO message");
        logger.warn("logger print WARN message");
        logger.error("logger print ERROR message");
        logger.fatal("Here is FATAL message");
    }
}

更多使用Log4j为项目配置日志输出应用详解以及示例演示的实现分析相关文章请关注PHP中文网!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案?如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案?Mar 17, 2025 pm 05:46 PM

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

如何使用適當的版本控制和依賴項管理創建和使用自定義Java庫(JAR文件)?如何使用適當的版本控制和依賴項管理創建和使用自定義Java庫(JAR文件)?Mar 17, 2025 pm 05:45 PM

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存?如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存?Mar 17, 2025 pm 05:44 PM

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射?如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射?Mar 17, 2025 pm 05:43 PM

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

Java的類負載機制如何起作用,包括不同的類載荷及其委託模型?Java的類負載機制如何起作用,包括不同的類載荷及其委託模型?Mar 17, 2025 pm 05:35 PM

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),