log4j - 資料庫日誌記錄



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。
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:///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:///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 類是一個非常簡單的示例,它初始化然後使用 Log4J 日誌記錄庫用於 Java 應用程式。

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 手冊。

廣告

© . All rights reserved.