log4j配置日志输出到数据库

2019-04-27 18:43|来源: 网路

log4j API提供 org.apache.log4j.jdbc.JDBCAppender 对象,它能够将日志信息在指定的数据库。

JDBCAppender 配置:

Property 描述
bufferSize 设置缓冲区的大小。默认大小为1
driver 设置驱动程序类为指定的字符串。如果没有指定驱动程序类,默认为sun.jdbc.odbc.JdbcOdbcDriver
layout 设置要使用的布局。默认布局是org.apache.log4j.PatternLayout
password Sets the database password.
sql 指定SQL语句在每次记录事件发生的时间执行。这可能是INSERT,UPDATE或DELETE
URL 设置JDBC URL
user 设置数据库用户名

日志表配置:

开始使用基于JDBC日志,要创建在哪里保存日志信息的表。下面是创建日志表的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的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和在其中创建的日志表的数据库密码。SQL语句是使用日志表名和输入值到表,需要执行INSERT语句。

JDBCAppender不需要明确定义的布局。相反,使用PatternLayout 传递给它 SQL语句

如果想拥有相当于上述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{
  /* 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");
  }
}

编译和运行:

下面是步骤编译并运行上述程序。确保进行编译和执行之前,适当地设置PATH和CLASSPATH。

所有的库应该在CLASSPATH以及log4j.properties文件应该在PATH可用。所以有以下几点:

  • 创建log4j.properties如上图所示。

  • 创建log4jExample.java如上图所示,并对其进行编译。

  • 执行log4jExample二进制运行程序。

现在检查DBNAME数据库里面日志表,发现下面的条目(记录):

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的手册以获取更多信息。

相关问答

更多

如何使用log4j把完善的日志信息保存进数据库?

try { VisitedCountAction a = null; a.equals(null); } catch (Exception e) { System.out.println(e.toString()); StackTraceElement[] t = e.getStackTrace(); for (int i = 0; i < t.length; i++) { System.out.println(t[i].toString()); } }

求教spring aop 与 log4j 配合 完成系统日志功能,同时输出到文件与数据库的实例.

您所提到的这个问题,我之前也遇到过,推荐您去参考一下这的 教程,他们的 java教程中基本都有这样的讲解 参考资料 http://android.ixueku.com 希望对你有帮助哦

spring aop + log4j如何实现详细的后台操作日志,并输出的数据库

你可以采用logback 这个插件,可以任意切入哪个类,可以控制日志的级别。如果是业务操作日志最好是定义在Service层,DAO层就不要写业务了。 logback相比较log4j的优势 slf4j支持参数化的logger.error("帐号ID:{}不存在", userId); 告别了if(logger.isDebugEnable()) 时代。 另外logback的整体性能比log4j也较佳,hibernate等项目已经采用了slf4j。

如何使用Log4j,然后把记录存入数据库

我觉得你在使用log4j的时候,可以同时进行写 日志文件和录入数据库两个操作。因为你写日志文件的时候,格式都是统一的。按照这个格式设计对应的数据库表 结构即可。然后执行插入 语句。免得你去读日志文件,还得用","去分解你的 记录,虽然能实现,但麻烦一些。

log4j无日志生成? 我将一个web项目部署在tomcat server.xml配置文件中,当我启动tomcat是无日志输出。

tomcat 自己有个日志包,它会有个日志输出,在tomcat根目录下; 你自己写的这个,看看是不是Level设置上的问题(级别的设置)。 这个是Tomcat安装目录下有自己的日志配置文件;我的是D:\tomcat\conf\logging.properties 这个文件定义了Tomcat自己的日志输出配置,级别是INFO org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO 希望这个对你有点用哈!!

如何配置log4j只保留最近7天的日志文件?(How to configure log4j to only keep log files for the last seven days?)

您可以在单独的脚本中执行您的内务管理,该脚本可以每天运行。 这样的东西 find /path/to/logs -type f -mtime +7 -exec rm -f {} \; You can perform your housekeeping in a separate script which can be cronned to run daily. Something like this: find /path/to/logs -type f -mtime +7 -exec rm -f ...

如何清理Log4j中的日志消息以将其保存在数据库中(How to sanitize log messages in Log4j to save them in database)

看看这个非官方的Log4J JDBCAppender ,它解决了这个问题,并且在Apache 2.0许可下分发。 与org.apache.log4j.jdbc.JDBCAppender比较引用其功能: 登录到(关系数据库) 灵活的连接处理(尚不支持DataSource) 灵活的sql命令来执行实际日志记录 已准备好的语句和存储过程(J2SDK 1.4+)支持 启用特殊字符(例如'(单引号)和(逗号))的消息记录 灵活的桌子和柱子结构 灵活的ID生成 允许多个PatternLayout应用程序; 在 ...

Log4j没有将日志写入数据库(Log4j not writing logs to database)

您将在控制台上看到日志消息,因为您已将所有日志消息发送到控制台,但只有logging.simple.jdbcLogger层次结构下的记录器才会发送到jdbcAppender 。 你在控制台上看到logging.simple.jdbcLogger消息吗? You'll see log messages on the console because you've sent all log messages to the console, but only loggers under the hiera ...

如何使用log4j将日志写入Jmeter上的mysql数据库?(How to use log4j write logs into a mysql database on Jmeter?)

请检查conf # JMeter does not use log4j as logging system # This configuration will only be used by libraries that do use log4j # or your custom code if it uses it # For logging configuration of JMeter, it needs to be done in user.properties 怎么运行的。 如果你有一 ...