扫码一下
查看教程更方便
log4j API 提供了 org.apache.logging.log4j.jdbc.JDBCAppender
对象,它可以将日志信息放在指定的数据库中。
属性 | 描述 |
---|---|
bufferSize | 设置缓冲区大小。 默认大小为 1。 |
driver | 将驱动程序类设置为指定的字符串。 如果未指定驱动程序类,则默认为 sun.jdbc.odbc.JdbcOdbcDriver 。 |
layout | 设置要使用的布局。 默认布局是 org.apache.logging.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
);
对于 MySQL 数据库,我们必须使用创建 logs 表的实际 DBNAME、用户 ID 和密码。 SQL 语句是执行一个 INSERT 语句,表名 LOGS 和要输入到表中的值。
JDBCAppender 不需要显式定义布局。 相反,传递给它的 SQL 语句使用 PatternLayout。
如果我们希望拥有与 log4j2.properties 文件等效的 XML 配置文件,那么这里是内容
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<Configuration>
<appender name="DB" class="org.apache.logging.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.logging.log4j.PatternLayout">
</layout>
</appender>
<logger name="log4j.rootLogger" additivity="false">
<level value="DEBUG"/>
<appender-ref ref="DB"/>
</logger>
</Configuration>
下面的 Java 类是一个非常简单的示例,它初始化并使用用于 Java 应用程序的 Log4J 日志库。
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.sql.*;
import java.io.*;
import java.util.*;
public class log4jExample{
static Logger logger = LogManager.getLogger(log4jExample.class.getName());
public static void main(String[] args)throws IOException,SQLException{
logger.debug("Debug");
logger.info("Info");
}
}
以下是编译和运行上述程序的步骤。 在继续编译和执行之前,请确保你已正确设置 PATH 和 CLASSPATH。
所有库都应该在 CLASSPATH 中可用,并且我们的 log4j2.xml 文件应该在 PATH 中可用。 按照给定的步骤
mysql > select * from logs;
+---------+------------+--------------+-------+---------+
| USER_ID | DATED | LOGGER | LEVEL | MESSAGE |
+---------+------------+--------------+-------+---------+
| | 2022-05-29 | log4jExample | DEBUG | Debug |
| | 2022-05-29 | log4jExample | INFO | Info |
+---------+------------+--------------+-------+---------+
2 rows in set (0.00 sec)
注意
- 这里 x 用于输出与生成日志事件的线程关联的嵌套诊断上下文 (NDC)。 我们使用 NDC 来区分处理多个客户端的服务器端组件中的客户端。 查看 Log4J 手册以获取更多信息。