Log4j API 提供了 org.apache.Log4j.jdbc.JDBCAppender
對(duì)象,該對(duì)象可將日志信息記錄到特定的數(shù)據(jù)庫(kù)之中。
屬性 | 描述 |
---|---|
bufferSize | 設(shè)置緩沖區(qū)大小,缺省為 1。 |
driver | 以字符串形式設(shè)置驅(qū)動(dòng)類,如果未設(shè)置,缺省為 sun.jdbc.odbc.JdbcOdbcDriver。 |
layout | 設(shè)置 layout,缺省為 org.apache.Log4j.PatternLayout。 |
password | 設(shè)置數(shù)據(jù)庫(kù)密碼。 |
sql | 設(shè)置每次日志事件觸發(fā)時(shí)需要執(zhí)行的 SQL 語(yǔ)句,該語(yǔ)句可以是 INSERT、UPDATE 或 DELETE。 |
URL | 設(shè)置 JDBC URL. |
user | 設(shè)置數(shù)據(jù)庫(kù)用戶名。 |
在使用基于 JDBC 的日志之前,先要?jiǎng)?chuàng)建一張表以保存所有日志信息,下面是用來(lái)創(chuàng)建 LOGS 表的 SQL 語(yǔ)句:
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
);
下面是一個(gè)為 JDBCAppender
編寫的 Log4j.properties 的示例配置文件,使用該對(duì)象將日志信息記錄到 LOGS 表中。
# 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 數(shù)據(jù)庫(kù),需要使用真實(shí)的 DBNAME、用戶名和密碼,就是剛才用來(lái)創(chuàng)建 LOGS 表的那些屬性。SQL 語(yǔ)句執(zhí)行 INSERT 語(yǔ)句,為 LOGS 表插入具體數(shù)值。
JDBCAppender
不需要顯示定義 layout,傳入的 SQL 語(yǔ)句會(huì)使用 PatternLayout
。
如果您需要和上述 Log4j.properties 文件等價(jià)的 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 類是一個(gè)非常簡(jiǎn)單的例子,該類在 Java 應(yīng)用中初始化并使用了 Log4j 類庫(kù)。
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");
}
}
編譯和運(yùn)行上述程序的步驟如下。在繼續(xù)編譯和運(yùn)行程序之前,確保正確設(shè)置了 PATH 和 CLASSPATH。
所有的類庫(kù)都需要包含在 CLASSPATH 中,Log4j.properties 文件需要包含在 PATH 中,步驟如下:
現(xiàn)在檢查 DBNAME 數(shù)據(jù)庫(kù)中的 LOGS 表,會(huì)發(fā)現(xiàn)如下條目:
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 用來(lái)輸出和生成日志事件線程相關(guān)聯(lián)的嵌套診斷上下文(NDC),我們使用 NDC 在處理多個(gè)客戶端的服務(wù)器端來(lái)區(qū)分客戶端,具體請(qǐng)查閱 Log4j 手冊(cè)。