log4j API提供了 org.apache.log4j.jdbc.JDBCAppender 對象,該對象可以將日誌記錄信息放入指定的數據庫中。
JDBCAppender配置
屬性 | 描述 |
---|---|
bufferSize | 設置緩衝區的大小。默認大小爲1 |
driver | 設置驅動程序類爲指定的字符串。如果沒有指定驅動程序類,默認爲sun.jdbc.odbc.JdbcOdbcDriver |
layout | 設置要使用的佈局。默認佈局是org.apache.log4j.PatternLayout |
password | 設置數據庫密碼。 |
sql | 指定每次發生記錄事件時要執行的SQL語句。這可以是INSERT,UPDATE或DELETE。 |
URL | 設置JDBC URL。 |
URL | 設置JDBC URL。 |
user | 設置數據庫用戶名。 |
日誌表配置
在開始使用基於JDBC的日誌記錄之前,應創建一個表來維護所有日誌信息。以下是用於創建LOGS表的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
);
配置文件示例
以下是JDBCAppender 的示例配置文件log4j.properties,該文件將用於將消息記錄到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數據庫,您將必須使用實際的DBNAME,用戶ID和密碼,並在其中創建了LOGS表。該SQL語句將執行INSERT語句,該語句的表名稱爲LOGS並在表中輸入值。
JDBCAppender不需要顯式定義佈局。相反,傳遞給它的SQL語句使用PatternLayout。
如果您希望擁有一個與上述 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數據庫中的LOGS表,您將找到以下條目(記錄):
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手冊。