亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

使用Log4j為項目配置日志輸出應用詳解以及示例演示的實現分析

2019-11-26 16:07:51
字體:
來源:轉載
供稿:網友

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支持兩種配置文件格式:

1. XML格式的文件

2. properties格式的文件

也可以完全不使用配置文件,而是在代碼中配置Log4j環境。但是,使用配置文件將使您的應用程序更加靈活。

Log4j定義配置文件

1.配置根Logger

其語法為:

復制代碼 代碼如下:

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

參數說明:  

level 是日志記錄的優先級,分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的級別。

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.FileAppender(文件)

  org.apache.log4j.DailyRollingFileAppender(每天產生一個日志文件)

  org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生新文件)

  org.apache.log4j.WriterAppender(將日志信息以流格式發送到任意指定的地方)

 

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有以下幾種:

  org.apache.log4j.HTMLLayout(以HTML表格形式布局),

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

  org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串),

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

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

%m 輸出代碼中指定的消息  

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

%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平臺為”/r/n”,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 '流水號' ,
    createDate varchar(45) default null comment '日志生成時間' ,
    thread varchar(45) default null comment '當前線程',
    level varchar(45) default null comment '當前日志級別' ,
    class varchar(45) default null comment '生成日志的類',
    message varchar(245) default null comment '日志具體信息',
    primary key(logId)
);

應用實例將日志信息同時輸出到控制臺,文件和數據庫中.

創建數據庫與 表

復制代碼 代碼如下:

/* 創建數據庫 */
create database db_log4j;

/* 切換數據庫 */
use  db_log4j;

/* 日志信息表 */
create table tb_log(
    logId int not null auto_increment comment '流水號' ,
    createDate varchar(45) default null comment '日志生成時間' ,
    thread varchar(45) default null comment '當前線程',
    level varchar(45) default null comment '當前日志級別' ,
    class varchar(45) default null comment '生成日志的類',
    message varchar(245) default null comment '日志具體信息',
    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('%d','%t','%-5p','%c','%m')


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");
    }

}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕精品在线视频| 欧美激情在线播放| 中文字幕亚洲在线| 国产精品第七十二页| 色综合久久88| 国产精品中文字幕久久久| 亚洲欧洲激情在线| 亚洲国产精品电影在线观看| 97精品视频在线| 欧美壮男野外gaytube| 欧美另类老肥妇| 亚洲深夜福利网站| 91在线视频成人| 欧美成人免费观看| 欧美成人精品三级在线观看| 中文字幕亚洲一区二区三区| 久久久www成人免费精品| 久久久久久尹人网香蕉| 欧美另类交人妖| 国产日本欧美一区二区三区在线| 欧美性理论片在线观看片免费| 欧美激情一区二区久久久| 国产丝袜高跟一区| 欧美精品一区在线播放| 在线电影欧美日韩一区二区私密| 亚洲欧美制服第一页| 91超碰caoporn97人人| 成人av色在线观看| 亚洲日韩欧美视频一区| 欧美又大又粗又长| 久久久91精品国产| 国产在线观看91精品一区| 最新国产成人av网站网址麻豆| 欧美黑人巨大xxx极品| 在线国产精品视频| 136fldh精品导航福利| 亚洲欧美成人一区二区在线电影| 亚洲色图美腿丝袜| 亚洲免费一级电影| 午夜精品久久久久久久久久久久久| 欧美一区二区三区……| 国产一区二区三区视频在线观看| 欧美日韩国产一区在线| 欧美猛交免费看| 亚洲第一精品夜夜躁人人躁| 精品日韩视频在线观看| 欧美片一区二区三区| 久久激情视频免费观看| 国产精品亚洲网站| 国产免费一区二区三区在线能观看| 欧美精品18videos性欧美| 亚洲最大的av网站| 91欧美精品午夜性色福利在线| 欧美成人免费视频| 国产精品亚洲视频在线观看| 一区二区三区视频观看| 亚洲第一天堂无码专区| 国产69精品久久久| 日本成人黄色片| 51久久精品夜色国产麻豆| 青青久久aⅴ北条麻妃| 国产精品久久电影观看| 日韩中文字幕网址| 国内精品美女av在线播放| 国产成人短视频| 欧美综合激情网| 久久精品在线播放| 久久精品国产亚洲一区二区| 伊人久久大香线蕉av一区二区| 国产精品美女免费| 青青草一区二区| 欧美综合国产精品久久丁香| 国产精品免费小视频| 青青草国产精品一区二区| 国外成人在线播放| 91香蕉电影院| 奇米一区二区三区四区久久| 最近中文字幕日韩精品| 亚洲电影免费在线观看| 精品视频—区二区三区免费| 亚洲欧美制服丝袜| 色综合色综合久久综合频道88| 久久久久久久久久久91| 久久亚洲精品一区二区| 精品视频9999| 亚洲一区二区久久| 亚洲国产欧美在线成人app| 久久久久久久久久久91| 色综合天天狠天天透天天伊人| 日韩精品极品视频免费观看| 欧美日韩在线另类| 51视频国产精品一区二区| 国产精品igao视频| 欧美日本中文字幕| 国内精品久久久久| 欧美激情中文网| 国产精品高潮呻吟久久av无限| 亚洲人成欧美中文字幕| 亚洲精品在线91| 中日韩美女免费视频网址在线观看| 欧美激情第6页| 色狠狠av一区二区三区香蕉蜜桃| 成人在线激情视频| 九九热精品视频国产| 日韩国产精品亚洲а∨天堂免| 亚洲综合最新在线| 久久精品中文字幕电影| 九九热精品在线| 欧美激情精品久久久久久蜜臀| 中文字幕亚洲天堂| 九九热精品视频在线播放| 日韩中文字幕av| 欧美黄色www| 国产69精品久久久久99| 亚洲欧美日韩视频一区| 国产成人亚洲精品| 欧美大片第1页| 国产精品揄拍一区二区| 国产成人精品在线播放| 亚洲天堂av综合网| 欧美激情视频网| 中文字幕久久久av一区| 98视频在线噜噜噜国产| 欧美成人免费一级人片100| 亚洲二区在线播放视频| 国产精品无码专区在线观看| 久久久久久久亚洲精品| 国产精品jvid在线观看蜜臀| 日韩在线观看成人| 国产一级揄自揄精品视频| 国产91九色视频| 欧美专区中文字幕| 国产v综合ⅴ日韩v欧美大片| 国产精品免费一区| 丝袜情趣国产精品| 另类少妇人与禽zozz0性伦| 日韩**中文字幕毛片| 欧美一乱一性一交一视频| www.99久久热国产日韩欧美.com| 国产一区二区三区直播精品电影| 亚洲成av人乱码色午夜| 国产精品国产三级国产aⅴ9色| 97免费中文视频在线观看| 亚洲天堂男人天堂| 精品国产老师黑色丝袜高跟鞋| 亚洲精品第一页| 欧美三级欧美成人高清www| 亚洲国产精品女人久久久| 欧美大肥婆大肥bbbbb| 欧美一级大片在线观看| 欧美麻豆久久久久久中文| 91麻豆国产语对白在线观看| 欧美精品videossex88| 欧美丰满少妇xxxxx做受| 在线播放日韩av| 日韩精品在线私人| 欧美黄色三级网站| 久久精品国产99国产精品澳门| 九九热这里只有精品6| 911国产网站尤物在线观看| 欧美激情网站在线观看| 亚洲大胆人体在线| 中文字幕精品www乱入免费视频| 国产精品视频中文字幕91|