鍍金池/ 教程/ Java/ 使用數(shù)據(jù)庫(kù)記錄日志
Logging 級(jí)別
使用文件記錄日志
PatternLayout
安裝
使用數(shù)據(jù)庫(kù)記錄日志
示例程序
架構(gòu)
Logging 方法
HTMLLayout
概述
配置
日志格式

使用數(shù)據(jù)庫(kù)記錄日志

Log4j API 提供了 org.apache.Log4j.jdbc.JDBCAppender 對(duì)象,該對(duì)象可將日志信息記錄到特定的數(shù)據(jù)庫(kù)之中。

JDBCAppender 配置

屬性 描述
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è)置了 PATHCLASSPATH。

所有的類庫(kù)都需要包含在 CLASSPATH 中,Log4j.properties 文件需要包含在 PATH 中,步驟如下:

  • 創(chuàng)建如上所示的 Log4j.properties 文件。
  • 創(chuàng)建如上所示的 Log4jExample.java 文件并編譯。
  • 運(yùn)行 Log4jExample。

現(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è)。

下一篇:Logging 方法