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