在上一講Apache log4j簡明教程(一)中介紹了log4j的基本概念,配置文件,以及將日誌寫入文件的方法,並給出了一個詳細的示例。這一講,我在繼續談一談如何使用log4j將日誌寫入MySQL數據庫。html
將日誌寫入數據庫須要經歷(1)創建MySQL數據庫日誌記錄表,(2)配置log4j配置文件,(3)編寫Java執行程序三大步驟,下面將詳細闡述三個步驟的具體內容。java
創建MySQL數據庫日誌記錄表mysql
因爲每一個人想記錄在MySQL數據庫中的日誌信息的不一樣,建立的表也各不相同,下面給出一個實用的示例:sql
USE `logs` CREATE TABLE log4j( logId INT AUTO_INCREMENT PRIMARY KEY NOT NULL, logDate VARCHAR(10), logClientIP VARCHAR(15), logName VARCHAR(255), logLevel VARCHAR(5), logMsg VARCHAR(255) );
配置log4j.properties數據庫
由上一講知道將日誌寫入MySQL時,數據源是DB,詳細的實現類是JDBCAppender。JDBCAppender中與鏈接MySQL相關的配置參數以下表:apache
driver | 設置鏈接數據庫的驅動程序,如MySQL的驅動字符串爲:com.mysql.jdbc.Driver; |
URL | 設置數據庫的鏈接字符串; |
user | 設置數據庫的用戶名; |
password | 設置數據庫的密碼; |
sql | 設置操做數據庫的SQL語句; |
詳細的配置參見下面的示例: app
# 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://192.168.31.221/logs # Set Database Driver log4j.appender.DB.driver=com.mysql.jdbc.Driver # Set database user name and password log4j.appender.DB.user=test log4j.appender.DB.password=test # Set the SQL statement to be executed. log4j.appender.DB.sql=INSERT INTO log (logDate, logClientIP, logName, logLevel, logMsg) VALUES('%d','%X{clientIP}','%C','%p','%m') # Define the layout for file appender log4j.appender.DB.layout=org.apache.log4j.PatternLayout
配置文件如何配置的問題在上一講已經講解過了,此處再也不冗述,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/logs"/> <param name="driver" value="com.mysql.jdbc.Driver"/> <param name="user" value="test"/> <param name="password" value="test"/> <param name="sql" value="INSERT INTO log (logDate, logClientIP, logName, logLevel, logMsg) VALUES('%d','%X{clientIP}','%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執行程序url
1 package org.warnier.zhang.demo; 2 3 import java.net.InetAddress; 4 import java.net.UnknownHostException; 5 6 import org.apache.log4j.Logger; 7 import org.apache.log4j.MDC; 8 9 public class Test { 10 11 private static Logger logger = Logger.getLogger(Test.class); 12 13 public static void main(String[] args) throws UnknownHostException { 14 /** 15 * 獲取客戶端的IP; 16 */ 17 InetAddress inetAddress = InetAddress.getLocalHost(); 18 String clientIP = inetAddress.getHostAddress(); 19 MDC.put("clientIP", clientIP); 20 21 logger.trace("TRACE > start logging..."); 22 logger.debug("DEBUG > start logging..."); 23 logger.info("INFO > start logging..."); 24 logger.warn("WARN > start logging..."); 25 logger.error("ERROR > start logging..."); 26 logger.fatal("FATAL > start logging..."); 27 } 28 29 }
到此是否是就結束了?讀者可能會問:「Java程序中並無涉及到JDBC的操做,是怎麼將日誌寫到MySQL數據的?」其實,在上一講就談到,log4j採用了一種機制,可以將日誌直接寫到數據庫,換言之,對數據庫的操做已經由log4j框架自己承包了。細心的讀者能夠看到在上一講中將日誌寫進文件時也沒有涉及到文件操做,緣由同上。還須要說起的是,雖然這篇博客是採用MySQL數據庫來說述的,可是不要誤認爲log4j不兼容其餘數據庫,實際上只要是關係型數據庫,對上述的配置文件進行相應的配置後,log4j都可以很好支持。spa
下面貼上本身的處理結果: