Tlog是每一個項目開發中必須的功能,日誌是在程式運行時在其他檔案中記錄的運行資訊。
在應用程式中輸出日誌有三個目的:
1 監視代碼中變數的變化情況,把資料周期性地記錄到檔案中供其他應用進行統計分析工作。
2 跟蹤代碼運行時軌跡,作為日後審計的依據。
3 擔當整合式開發環境中的調試器,向檔案或控制器列印代碼的調試資訊。
使用者可以自由地選擇實現日誌介面的第三方軟體,比如:Log4J、NoOpLog、SimpleLog等都是通用日誌包的實現。
記錄檔作用:是一個記錄器,用於記錄程式運行過程中的各種資訊。
日誌配置:主要設定記錄的層級、存放位置和顯示資訊的布局。可以使用log4j.properties或log4j.xml格式進行配置。
log4j.properties:
載入log4j.properties步驟:
1:將log4j的jar包放到lib目錄下
2:將log4j.properties檔案放到src目錄下
3:在類中匯入類import org.apache.log4j.Logger;
4:在類中定義對象Logger logger = Logger.getLogger(this.getClass());
5:使用logger輸出日誌logger.info(string);
Apache通用日誌包(Log4J,下載地址:http://logging.apache.org/log4j)是Apache的一個開原始碼項目,它提供了一組通用的日誌介面,通用日誌包中的兩個常用介面是LogFactory和Log。
通用日誌包把日誌訊息分為六種層級:
FATAL(致命層級)、ERROR(錯誤層級)、WARN(警告層級)、INFO(一般資訊)、DEBUG(調試資訊)和TRACE(跟蹤資訊)。
其中FATAL層級最高,TRACE層級最低,通用日誌包採用記錄層級機制,可以靈活的控制輸出的日誌內容。
org.apache.commons.logging.Log介面提供如下方法輸出不同層級的日誌。
| 方法名稱 |
說明 |
| fatal(Object message) |
輸出FATAL層級的日誌訊息 |
| error(Object message) |
輸出ERROR層級的日誌訊息 |
| warn(Object message) |
輸出WARN層級的日誌訊息 |
| info(Object message) |
輸出INFo層級的日誌訊息 |
| debug(Object message) |
輸出DEBUG層級的日誌訊息 |
| trace(Object message) |
輸出TRACE層級的日誌訊息 |
Log4j允許我們控制日誌資訊輸送的目的地,可以是控制台、檔案、GUI組件、UNIX Syslog守護進程等;也允許我們控制每一條日誌的輸出格式;通過定義每一條日誌資訊的層級(fatal,error,warn,info,debug),我們能夠更加細緻地控制日誌的產生過程。同時,這些可以通過一個設定檔來靈活地進行配置,而不需要修改應用的代碼。
Log4J設定檔內容主要由三大組件構成:
① Logger:負責組建記錄檔,並能根據配置的記錄層級來決定什麼日誌訊息應該被輸出,比指定層級高的日誌資訊都能夠輸出,比如指定日子層級為INFO,那麼INFO、WARN、ERROR、FATAL日誌都能夠輸出。
② Appender:定義日誌訊息輸出的目的地,指定日誌訊息應該被輸出到什麼地方,可以是控制台、檔案或者網路裝置。
③ Layout:指定日誌訊息的輸出格式。
Log4J的設定檔有兩種格式,一種是xml檔案,一種是properties檔案。下面採用properties檔案的形式進行日誌配置。定義設定檔名為log4j.properties,放置在classes目錄下。
1 配置Logger組件
配置Logger組件的文法:
格式:
#log4j.rootLogger=記錄層級,Appender名稱1, Appender名稱2,…
說明:
a、層級分別是:fatal > error > warn > info > debug > trace
b、存放位置列表使用逗號進行分隔,分別是存放變數的說明(在下面配置輸出目的地時需要引用)
注意:
如果層級是info,則大於等於info的才記錄,比info層級低的不記錄(其他層級類似)。
#其中記錄層級可以是前面定義的六種層級中的一種,Appender名稱可以是任何合法的標示符。
#可以是一個,也可以是多個,下面配置的記錄層級是INFO,Appender名稱分別是A1和R: 代碼:log4j.rootLogger=INFO, A1 ,R
2 針對Logger的Appender進行配置,配置日誌訊息輸出目的地Appender,其文法是:
格式:
log4j.appender.存放位置變數 = 存放位置類的完全限定名(一般由log4j組件提供)①
log4j.appender.存放位置變數.屬性 = 屬性值
說明:
a、log4j提供了幾種與存放位置對應的類
1、org.apache.log4j.ConsoleAppender(控制台)
2、org.apache.log4j.FileAppender(檔案)
3、org.apache.log4j.DailyRollingFileAppender(每天產生一個記錄檔)
4、org.apache.log4j.RollingFileAppender(檔案到達一定尺寸時,則產生一個新的檔案)
5、org.apache.log4j.WriterAppender(日誌流,可以日誌訊息以流格式發送到任何指定的地方)
b、File屬性
可以設定輸出的具體檔案名稱
c、Threshold屬性
可以設定輸出的層級
代碼: log4j.appender.A1=org.apache.log4j.FileAppender
log4j.appender.A1.File=c:/log4j.htm ②
① Log4J提供的Appender類有以下幾種:如:上a。
② 將日誌輸出到C:/log4j.htm檔案中
3 配置Layout組件 配置Layout組件的文法:
格式:
log4j.appender.存放位置變數.layout = 布局類的完全限定名(一般由log4j組件提供)①
log4j.appender.存放位置變數.layout.屬性 = 屬性值
說明:
a、log4j提供了幾種與布局對應的類
1、org.apache.log4j.HTMLLayout(以html表格形式布局)
2、org.apache.log4j.PatternLayout(按指定的模式進行布局,通過設定屬性可以靈活的指定配置模式)
3、org.apache.log4j.SimpleLayout(簡單的布局,包含了層級和資訊字串)
4、org.apache.log4j.TTCCLayout(包含時間、線程、類別等資訊的布局)
b、布局中ConversionPattern屬性的參數:
Log4J採用類似C語言中的printf函數的列印格式格式化日誌資訊,列印參數如下:
%m 輸出代碼中指定的訊息
%p 輸出優先順序,即DEBUG,INFO,WARN,ERROR,FATAL
%r 輸出自應用啟動到輸出該log資訊耗費的毫秒數
%c 輸出所屬的類目,通常就是所在類的全名
%t 輸出產生該日誌事件的線程名
%n 輸出一個斷行符號分行符號,Windows平台為“rn”,Unix平台為“n”
%d 輸出日誌時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921
%l 輸出日誌事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數。
#例如:
log4j.appender.A1.layout=org.apache.log4j.HTMLLayout log4j.appender.R.layout.ConversionPattern=%-d{HH:mm:ss} [%c]-[%p] %m%n ②
在Tomcat中,內建通用日誌介面包(commons-logging.jar),並且只要在classes目錄下存在log4J.properties檔案就會自動的載入Log4J的配置資訊。通過內建通用日誌包引導Log4J進行日誌輸出。因此不需要配置通用日誌介面,通用日誌介面設定檔應該放在/WEB-INF/classes目錄下,檔案名稱為:commons-logging.properties,配置代碼如下:
配置通用日誌包的文法:#org.apache.commons.logging.Log=實作類別全限定名
例如:
#比如,Log4J的實作類別是: org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JCategoryLog
☆:在程式中使用Log4J可以通過自身的API,也可以使用通用日誌包介面進行訪問。
//通用日誌包使用
//匯入:org.apache.commons.logging.Log
//匯入:org.apache.commons.logging.LogFactory
Log log=LogFactory.getLog(this.getClass());
log.debug("debug........");
log.info("info..........");
//Log4J自身API使用
//匯入org.apache.log4j.Logger
Logger logger = Logger.getLogger (this.getClass());
logger.debug("debug........"); logger.info("info..........");常用的配置:
配置1:
#配置根:og4j.rootLogger=DEBUG,A1,R
#配置控制台輸出:
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n
#配置每天一個記錄檔:
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=blog_log.txt
log4j.appender.R.MaxFileSize=500KB
log4j.appender.R.MaxBackupIndex=10
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n
配置2:
log4j.rootLogger=DEBUG,CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE
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}[日期]%n%p[層級]%n%x[迴圈診斷環境]%n%t[線程] n%c[類]%n%m[訊息]%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
########################
# 每天一個記錄檔的配置
########################
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
########################
# 郵件配置 (需要JavaMail和JAF的支援)
#######################
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=iambenbenchen@163.com
log4j.appender.MAIL.SMTPHost=mail.163.com
log4j.appender.MAIL.Subject=Log4J 訊息
log4j.appender.MAIL.To=iambenbenchen@163.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
########################
# 資料庫配置(mysql,注意:每行之後不能有空格,否則報錯)
#######################
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= root
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
範例程式碼:
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.Logger;
public class LoginAction{
Log log=LogFactory.getLog(this.getClass());
Logger logger = Logger.getLogger (this.getClass());
public void method(){
log.info(userInfo.getUserInfo().getUserName()+ " log_info開始登陸");
logger.info(userInfo.getUserInfo().getUserName()+ " logger_info開始登陸");
}
}
public class LoginServlet extends HttpServlet{
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
...
Logger logger=Logger.getLogger(this.getClass());
logger.info(name+"開始登入");
...
logger.info(name+"登入失敗"+e.getMessage());
...
logger.info(name+"登入成功");
...
}
}
log4j.properties檔案:
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### direct messages to file hibernate.log ###
#log4j.appender.file=org.apache.log4j.FileAppender
#log4j.appender.file.File=hibernate.log
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
#定義一個名字為file的Appender,它的類型是RollingFileAppender
log4j.appender.file=org.apache.log4j.RollingFileAppender
#設定最大檔案尺寸為1MB,當記錄檔大小達到1MB時,開始備份到備份檔案中
log4j.appender.file.MaxFileSize=1MB
#設定備份檔案的最大數目為1024個檔案,超過1024將自動刪除最舊的檔案
log4j.appender.file.MaxBackupIndex=1024
#指定file Appender輸出的記錄檔的名字和存放路徑。
log4j.appender.file.File=D\:/salog4j.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%c]-[%-5p] %m%n%n
### set log levels - for more verbose logging change 'info' to 'debug' ###
log4j.rootLogger=info, file
#log4j.logger.org.hibernate=info
#log4j.logger.org.hibernate=debug
### log HQL query parser activity
#log4j.logger.org.hibernate.hql.ast.AST=debug
### log just the SQL
#log4j.logger.org.hibernate.SQL=debug
### log JDBC bind parameters ###
#log4j.logger.org.hibernate.type=info
#log4j.logger.org.hibernate.type=trace
### log schema export/update ###
#log4j.logger.org.hibernate.tool.hbm2ddl=debug
### log HQL parse trees
#log4j.logger.org.hibernate.hql=debug
### log cache activity ###
#log4j.logger.org.hibernate.cache=debug
### log transaction activity
#log4j.logger.org.hibernate.transaction=debug
### log JDBC resource acquisition
#log4j.logger.org.hibernate.jdbc=debug
### enable the following line if you want to track down connection ###
### leakages when using DriverManagerConnectionProvider ###
#log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace
log4j.xml設定檔設定
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender class="org.apache.log4j.DailyRollingFileAppender" name="rollingFile">
<param name="DatePattern" value=".yyyy-MM-dd"/>
<param name="File" value="c:\log\log.log"/>
<param name="Encoding" value="GBK"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p %-5c{3}:%L %X{client} -> %m%n"/>
</layout>
</appender>
<logger name="com.lovebay">
<level value="DEBUG"/>