在上一讲 Apache log4j简明教程(一) 中介绍了log4j的基本概念,配置文件,以及将日志写入文件的方法,并给出了一个详细的示例。这一讲,我在继续谈一谈如何使用log4j将日志写入MySQL数据库。
将日志写入数据库需要经历(1)建立MySQL数据库日志记录表,(2)配置log4j配置文件,(3)编写Java执行程序三大步骤,下面将详细阐述三个步骤的具体内容。
由于每个人想记录在MySQL数据库中的日志信息的不同,创建的表也各不相同,下面给出一个实用的示例:
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) );
由上一讲知道将日志写入MySQL时,数据源是DB,详细的实现类是JDBCAppender。JDBCAppender中与连接MySQL相关的配置参数如下表:
driver | 设置连接数据库的驱动程序,如MySQL的驱动字符串为:com.mysql.jdbc.Driver; |
URL | 设置数据库的连接字符串; |
user | 设置数据库的用户名; |
password | 设置数据库的密码; |
sql | 设置操作数据库的SQL语句; |
详细的配置参见下面的示例:
# 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>
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都能够很好支持。
下面贴上自己的处理结果: