log4j API提供 org.apache.log4j.jdbc.JDBCAppender 對(duì)象,它能夠?qū)⑷罩拘畔⒃谥付ǖ臄?shù)據(jù)庫。
Property |
描述 |
bufferSize |
設(shè)置緩沖區(qū)的大小。默認(rèn)大小為1 |
driver |
設(shè)置驅(qū)動(dòng)程序類為指定的字符串。如果沒有指定驅(qū)動(dòng)程序類,默認(rèn)為sun.jdbc.odbc.JdbcOdbcDriver |
layout |
設(shè)置要使用的布局。默認(rèn)布局是org.apache.log4j.PatternLayout |
password |
Sets the database password. |
sql |
指定SQL語句在每次記錄事件發(fā)生的時(shí)間執(zhí)行。這可能是INSERT,UPDATE或DELETE |
URL |
設(shè)置JDBC URL |
user |
設(shè)置數(shù)據(jù)庫用戶名 |
開始使用基于JDBC日志,要?jiǎng)?chuàng)建在哪里保存日志信息的表。下面是創(chuàng)建日志表的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
);
以下是將用于將消息記錄到一個(gè)日志表中的示例配置文件 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數(shù)據(jù)庫,必須要使用實(shí)際DBNAME,用戶ID和在其中創(chuàng)建的日志表的數(shù)據(jù)庫密碼。SQL語句是使用日志表名和輸入值到表,需要執(zhí)行INSERT語句。
JDBCAppender不需要明確定義的布局。相反,使用PatternLayout 傳遞給它 SQL語句
如果想擁有相當(dāng)于上述log4j.properties文件的XML配置文件,可以參考在這里的內(nèi)容:
<?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日志庫例子,初始化,然后使用。
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)行上述程序。確保進(jìn)行編譯和執(zhí)行之前,適當(dāng)?shù)卦O(shè)置PATH和CLASSPATH。
所有的庫應(yīng)該在CLASSPATH以及l(fā)og4j.properties文件應(yīng)該在PATH可用。所以有以下幾點(diǎn):
現(xiàn)在檢查DBNAME數(shù)據(jù)庫里面日志表,發(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被用于產(chǎn)生該記錄事件的線程相關(guān)聯(lián)輸出的NDC(嵌套診斷上下文)。使用NDC來區(qū)分客戶的服務(wù)器端組件處理多個(gè)客戶端。檢查L(zhǎng)og4J的手冊(cè)以獲取更多信息。