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 表中。
# 使用附加器文件定义根记录器 log4j.rootLogger = DEBUG, DB # 定义 DB 附加器 log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender # 设置 JDBC URL log4j.appender.DB.URL=jdbc:mysql://localhost/DBNAME # 设置数据库驱动程序 log4j.appender.DB.driver=com.mysql.jdbc.Driver # 设置数据库用户名和密码 log4j.appender.DB.user=user_name log4j.appender.DB.password=password # 设置要执行的 SQL 语句。 log4j.appender.DB.sql=INSERT INTO LOGS VALUES('%x','%d','%C','%p','%m') # 定义文件附加器的布局 log4j.appender.DB.layout=org.apache.log4j.PatternLayout
对于 MySQL 数据库,您必须使用实际的 DBNAME、用户 ID 和密码,其中您已创建了 LOGS 表。SQL 语句将使用表名 LOGS 和要输入到表中的值来执行 INSERT 语句。
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://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{ /* 获取要打印的实际类名 */ 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 手册。