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配置文件,可以參考在這裏的內容:

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的手冊以獲取更多信息。