log4j紀錄檔記錄到資料庫


log4j API提供 org.apache.log4j.jdbc.JDBCAppender 物件,它能夠將紀錄檔資訊在指定的資料庫。

JDBCAppender 組態:

Property 描述
bufferSize 設定緩衝區的大小。預設大小為1
driver 設定驅動程式類為指定的字串。如果沒有指定驅動程式類,預設為sun.jdbc.odbc.JdbcOdbcDriver
layout 設定要使用的布局。預設布局是org.apache.log4j.PatternLayout
password Sets the database password.
sql 指定SQL語句在每次記錄事件發生的時間執行。這可能是INSERT,UPDATE或DELETE
URL 設定JDBC URL
user 設定資料庫使用者名

紀錄檔表組態:

開始使用基於JDBC紀錄檔,要建立在哪裡儲存紀錄檔資訊的表。下面是建立紀錄檔表的SQL語句:

CREATE TABLE LOGS
   (USER_ID VARCHAR(20) NOT NULL,
    DATED   DATE NOT NULL,
    LOGGER  VARCHAR(50) NOT NULL,
    LEVEL   VARCHAR(10) NOT NULL,
    MESSAGE VARCHAR(1000) NOT NULL
   );

組態檔案範例:

以下是將用於將訊息記錄到一個紀錄檔表中的範例組態檔案 log4j.properties的JDBCAppender

# Define the root logger with appender file
log4j.rootLogger = DEBUG, DB

# Define the DB appender
log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender

# Set JDBC URL
log4j.appender.DB.URL=jdbc:mysql://localhost/DBNAME

# Set Database Driver
log4j.appender.DB.driver=com.mysql.jdbc.Driver

# Set database user name and password
log4j.appender.DB.user=user_name
log4j.appender.DB.password=password

# Set the SQL statement to be executed.
log4j.appender.DB.sql=INSERT INTO LOGS 
                      VALUES('%x','%d','%C','%p','%m')

# Define the layout for file appender
log4j.appender.DB.layout=org.apache.log4j.PatternLayout

這裡使用的是MySQL資料庫,必須要使用實際DBNAME,使用者ID和在其中建立的紀錄檔表的資料庫密碼。SQL語句是使用紀錄檔表名和輸入值到表,需要執行INSERT語句。

JDBCAppender不需要明確定義的布局。相反,使用PatternLayout 傳遞給它 SQL語句

如果想擁有相當於上述log4j.properties檔案的XML組態檔案,可以參考在這裡的內容:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>

<appender name="DB" class="org.apache.log4j.jdbc.JDBCAppender">
   <param name="url" value="jdbc:mysql://localhost/DBNAME"/>
   <param name="driver" value="com.mysql.jdbc.Driver"/>
   <param name="user" value="user_id"/>
   <param name="password" value="password"/>
   <param name="sql" value="INSERT INTO LOGS VALUES('%x',
                             '%d','%C','%p','%m')"/>
   <layout class="org.apache.log4j.PatternLayout">
   </layout>

</appender>

<logger name="log4j.rootLogger" additivity="false">
   <level value="DEBUG"/>
   <appender-ref ref="DB"/>
</logger>

</log4j:configuration>

範例程式:

下面的Java類是一個非常簡單的Java應用程式使用Log4J紀錄檔庫例子,初始化,然後使用。

import org.apache.log4j.Logger;
import java.sql.*;
import java.io.*;
import java.util.*;

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("Debug");
     log.info("Info");
  }
}

編譯和執行:

下面是步驟編譯並執行上述程式。確保進行編譯和執行之前,適當地設定PATH和CLASSPATH。

所有的庫應該在CLASSPATH以及log4j.properties檔案應該在PATH可用。所以有以下幾點:

  • 建立log4j.properties如上圖所示。

  • 建立log4jExample.java如上圖所示,並對其進行編譯。

  • 執行log4jExample二進位制執行程式。

現在檢查DBNAME資料庫裡面紀錄檔表,發現下面的條目(記錄):

mysql >  select * from LOGS;
+---------+------------+--------------+-------+---------+
| USER_ID | DATED      | LOGGER       | LEVEL | MESSAGE |
+---------+------------+--------------+-------+---------+
|         | 2010-05-13 | log4jExample | DEBUG | Debug   |
|         | 2010-05-13 | log4jExample | INFO  | Info    |
+---------+------------+--------------+-------+---------+
2 rows in set (0.00 sec)

註:此處X被用於產生該記錄事件的執行緒相關聯輸出的NDC(巢狀診斷上下文)。使用NDC來區分客戶的伺服器端元件處理多個用戶端。檢查Log4J的手冊以獲取更多資訊。