Log4j2记录日志到数据库(MySQL&MongoDB)

【摘要】

    本文主要介绍Log4j2记录日志到MySQL和MongoDB数据库,用简单的例子来讲解,并解决了一些官方配置可能出现的错误。具体内容可参见官方文档:http://logging.apache.org/log4j/2.x/manual/appenders.html左侧导航栏的Appenders->JDBC和Appenders->NoSQL两项

【引用】

    Log4j2的基本配置我在前面的文章已经介绍,具体可参见:http://blog.csdn.net/ererfei/article/details/46831807

1.    Log4j2记录日志到MySQL

1.1.   首先创建存储日志的数据表ibs_log

创建语句如下:

[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. DROP TABLE IF EXISTS `ibs_log`;  
  2. CREATE TABLE `ibs_log` (  
  3.  `log_id` int(10) NOT NULL AUTO_INCREMENT,  
  4.  `log_date` datetime NOT NULL COMMENT '日期',  
  5.  `log_file` varchar(255) DEFAULT NULL COMMENT '文件名',  
  6.  `log_line` varchar(255) DEFAULT NULL COMMENT '行号',  
  7.   `log_thread`varchar(255) DEFAULT NULL COMMENT '线程',  
  8.  `log_level` varchar(255) DEFAULT NULL COMMENT 'Log级别 info warndebug error等',  
  9.  `log_message` varchar(2048) DEFAULT NULL COMMENT 'Log信息',  
  10.  PRIMARY KEY (`log_id`,`log_date`),  
  11.   KEY`INDEX_LOG_DATE` (`log_date`) USING BTREE  
  12. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;  

1.2.   创建Log4j2.xml配置文件

需要创建数据表、数据行的对应关系

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0"encoding="UTF-8"?>  
  2. <!-- 不打印log4j内部日志,配置文件刷新频率为30秒 -->   
  3. <Configuration status="off"monitorInterval="30">  
  4.  <Appenders>  
  5.          <JDBC name="databaseAppender" tableName="ibs_log">  
  6.      <ConnectionFactory class="com.*.*.ConnectionFactory"method="getDatabaseConnection" />  
  7.      <Column name="log_date" isEventTimestamp="true"/>  
  8.      <Column name="log_file" pattern="%file" />  
  9.      <Column name="log_line" pattern="%line" />  
  10.      <Column name="log_thread" pattern="%thread" />  
  11.      <Column name="log_level" pattern="%level" />  
  12.      <Column name="log_message" pattern="%message"/>  
  13.          </JDBC>  
  14.  </Appenders>   
  15.  <Loggers>  
  16.    <!-- 打印等级:off、fatal、error、warn、info、debug、trace、all -->   
  17.    <Logger name="项目包名(com.*.*)" level="debug">  
  18.      <appender-ref ref="databaseAppender"/>  
  19.    </Logger>   
  20.    <Root level="off"></Root>  
  21.  </Loggers>  
  22. </Configuration>  

1.3.   创建数据库连接类ConnectionFactory

需要修改下面代码中用户名、密码、数据库名称为你使用的数据库对用的用户名密码以及名称:

【ConnectionFactory.Java

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.centerm.util;  
  2.    
  3. import java.sql.Connection;  
  4. import java.sql.SQLException;  
  5. import java.util.Properties;  
  6. import javax.sql.DataSource;  
  7. importorg.apache.commons.dbcp.DriverManagerConnectionFactory;  
  8. importorg.apache.commons.dbcp.PoolableConnection;  
  9. import org.apache.commons.dbcp.PoolableConnectionFactory;  
  10. importorg.apache.commons.dbcp.PoolingDataSource;  
  11. importorg.apache.commons.pool.impl.GenericObjectPool;  
  12.    
  13. public class ConnectionFactory {  
  14.          privatestatic interface Singleton {  
  15.        final ConnectionFactory INSTANCE = new ConnectionFactory();  
  16.     }  
  17.    
  18.    private final DataSource dataSource;  
  19.    
  20.    private ConnectionFactory() {  
  21.              try {  
  22.            Class.forName("com.mysql.jdbc.Driver");  
  23.        } catch (ClassNotFoundException e) {  
  24.            e.printStackTrace();  
  25.            System.exit(0);  
  26.        }  
  27.               
  28.        Properties properties = new Properties();  
  29.        properties.setProperty("user""用户名");  
  30.        properties.setProperty("password""密码"); //or get properties from some configuration file  
  31.    
  32.        GenericObjectPool<PoolableConnection>pool = new GenericObjectPool<PoolableConnection>();  
  33.        DriverManagerConnectionFactory connectionFactory = newDriverManagerConnectionFactory(  
  34.                 "jdbc:mysql://localhost:3306/数据库名称",properties  
  35.        );  
  36.        new PoolableConnectionFactory(  
  37.                 connectionFactory, pool, null,"SELECT 1"3falsefalse, Connection.TRANSACTION_READ_COMMITTED  
  38.        );  
  39.    
  40.        this.dataSource = new PoolingDataSource(pool);  
  41.     }  
  42.    
  43.    public static Connection getDatabaseConnection() throws SQLException {  
  44.        return Singleton.INSTANCE.dataSource.getConnection();  
  45.     }  
  46. }  

至此就可以运行项目测试了


1.4.   特别注意

由于项目启动时Log4j2是最先加载的内容,所以有可能出现ConnectionFactory这个类启动报错,所以需要在官网提供实例的基础上添加代码(上面类中已经添加):


2.    Log4j2记录日志到MongoDB

安装运行MongoDB:http://www.runoob.com/mongodb/mongodb-window-install.html

MongoDB驱动下载:http://central.maven.org/maven2/org/mongodb/mongo-java-driver/

Java MongoDB API学习:http://blog.csdn.net/ererfei/article/details/50857103

2.1.   创建数据库

运行MongoDB客户端mongo-cli.exe,使用命令”usetest”创建数据库test,创建该数据库的用户[root:password],不需要手动创建collection。

2.2.   创建Log4j2.xml配置文件

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0"encoding="UTF-8"?>  
  2.    
  3. <!--不打印log4j内部日志,配置文件刷新频率为30秒 -->   
  4. <Configuration status="off"monitorInterval="30">  
  5.   <Appenders>  
  6.     <NoSql name="databaseAppender">  
  7.       <MongoDb databaseName="test"collectionName="logData" server="127.0.0.1"port="27017" userName="root"password="password"/>  
  8.     </NoSql>  
  9.   </Appenders>  
  10.   <Loggers>  
  11.     <!-- 打印等级:off、fatal、error、warn、info、debug、trace、all -->   
  12.     <Logger name="com.*.*"level="debug">  
  13.       <appender-ref ref="databaseAppender"/>  
  14.     </Logger>   
  15.     <Root level="off"></Root>  
  16.   </Loggers>  
  17. </Configuration>  

!!!至此就可以运行项目测试了


log4j2可灵活的将日志打印在控制台、通过SMTP邮件发送、记录至文件、保存至数据库。本文介绍如何配置log4j2将日志记录至数据库


建立用于保存日志的数据库表:


CREATE TABLE `sys_log` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `level` varchar(32) NOT NULL,
  `logger` varchar(100) NOT NULL,
  `message` varchar(1000) DEFAULT NULL,
  `exception` varchar(10000) DEFAULT NULL,
  `date_add` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8mb4;


配置 databaseAppender :


<JDBC name="databaseAppender" tableName="sys_log">
      <ConnectionFactory class="cc.s2m.web.s2mBlog.util.StaticProp" method="getDatabaseConnection" />
      <Column name="date_add" isEventTimestamp="true" />
      <Column name="level" pattern="%level" />
      <Column name="logger" pattern="%logger" />
      <Column name="message" pattern="%message" />
      <Column name="exception" pattern="%ex{full}" />
    </JDBC>


其中 cc.s2m.web.s2mBlog.util.StaticProp 类的getDatabaseConnection方法为获取可用的datasource:


DriverManagerDataSource ds = new DriverManagerDataSource();
ds.setDriverClassName("com.MySQL.jdbc.Driver");

ds.setUrl("jdbc:mysql://127.0.0.1/s2mBlog?characterEncoding=utf8");

ds.setUsername("root");

ds.setPassword("123456");

return ds.getConnection();


然后指派您需要记录的日志,使用 databaseAppender 即可:


<logger name="SYSLOG" level="INFO" additivity="false">
      <appender-ref ref="databaseAppender"/> 
</logger>


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值