log4j - 写入数据库

  • 简述

    log4j API 提供了 org.apache.log4j.jdbc.JDBCAppender 对象,可以将日志信息放入指定的数据库中。
  • JDBCAppender 配置

    属性 描述
    bufferSize 设置缓冲区大小。默认大小为 1。
    driver 将驱动程序类设置为指定的字符串。如果未指定驱动程序类,则默认为sun.jdbc.odbc.JdbcOdbcDriver.
    layout 设置要使用的布局。默认布局是org.apache.log4j.PatternLayout.
    password 设置数据库密码。
    sql 指定每次发生日志事件时要执行的 SQL 语句。这可以是插入、更新或删除。
    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
       );
    
  • 示例配置文件

    以下是示例配置文件 log4j.properties 用于将消息记录到 LOGS 表的 JDBCAppender。
    
    # 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 数据库,您必须使用实际的 DBNAME、用户 ID 和密码,您在其中创建了 LOGS 表。SQL 语句是执行一条INSERT 语句,表名LOGS 和要输入到表中的值。
    JDBCAppender 不需要显式定义布局。相反,传递给它的 SQL 语句使用 PatternLayout。
    如果您希望有一个与上述等效的 XML 配置文件 log4j.properties 文件,然后这里是内容 -
    
    <?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{
       /* 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");
       }
    }
    
  • 编译和执行

    下面是编译和运行上述程序的步骤。确保您已设置PATHCLASSPATH 在进行编译和执行之前适当地进行。
    所有的库都应该在 CLASSPATH并且您的log4j.properties文件应该在 PATH 中可用。按照给定的步骤 -
    • 如上所示创建 log4j.properties。
    • 如上所示创建 log4jExample.java 并编译它。
    • 执行 log4jExample binary 来运行程序。
    现在检查 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)
    
    Note− 这里 x 用于输出与生成日志事件的线程关联的嵌套诊断上下文 (NDC)。我们使用 NDC 来区分处理多个客户端的服务器端组件中的客户端。查看 Log4J 手册以获取更多信息。