log4j 系列09 -- SSM 框架下 slf4j-log4j2 日志保存到 MySQL 数据库

10 篇文章 0 订阅

https://blog.csdn.net/m0_37459403/article/details/86501151

参考上文,有两种方法,一种是自建工具类获取数据库连接,另一种是调用配置好的连接池获取数据库连接。经测试,后一种方法老是报错,可能是我哪里没有配置好,暂时放弃,选用第一种方法。

【关键点: 两个工具类 + POM.xml

1、创建读取数据库 properties配置 的 工具类

为了使用项目中统一的数据库配置文件,创建工具类来读取,这样配置和使用分离,便于管理和修改配置。

参考:java读取properties的工具类PropertiesUtil

/** 
 * 说明:获取 classPath 下的 .properies 配置文件信息
*/
public class PropertiesUtil {
	
    private String properiesName = "";

    public PropertiesUtil() {

    }
    
    public PropertiesUtil(String fileName) {
        this.properiesName = fileName;
    }
    
    //使用时,调用这个即可
    public Properties getProperties() {
        Properties p = new Properties();
        InputStream in = null;
        try {
        	in = PropertiesUtil.class.getClassLoader().getResourceAsStream(properiesName);
            p.load(in);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
            	in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return p;
    }
    
    //调用Demo  注:我的MySQL配置文件为:dbconfig.properties
//  Properties p = new PropertiesUtil("dbconfig.properties").getProperties();
//	String value = p.getProperty("driverClassName");
//	System.out.println(value);

    
//    public String readProperty(String key) {
//        String value = "";
//        InputStream in = null;
//        try {
//            in = PropertiesUtil.class.getClassLoader().getResourceAsStream(properiesName);
//            Properties p = new Properties();
//            p.load(in);
//            value = p.getProperty(key);
//        } catch (IOException e) {
//            e.printStackTrace();
//        } finally {
//            try {
//                in.close();
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//        }
//        return value;
//    }

   
}

2、添加POM依赖

<!--log4j2连接数据库时需要使用到的包 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-dbcp2</artifactId>
    <version>2.6.0</version>
</dependency>

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>2.6.0</version>
</dependency>

2、创建数据库连接类

参考:除了本文顶部的参考文章,还参考了以下两篇:

http://logging.apache.org/log4j/2.0/manual/appenders.html     【官网】
org.apache.commons.dbcp2.PoolableConnection Example    【org.apache.commons.dbcp2 的使用】

注:官网给出的 ConnectionFactory 示例用的是 org.apache.commons.dbcp 和 org.apache.commons.pool 的1版本,百度搜了一下,目前主流都用的 2.X版本了,所以 POM 依赖升级为版本2 。带来的麻烦是官网 ConnectionFactory 中的一些代码用不了,需要更改成版本2的用法,经苦苦搜索找到了 “org.apache.commons.dbcp2 的使用” 这篇参考文章,依葫芦画瓢最终试验成功。

import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import java.util.Properties;

import org.apache.commons.dbcp2.DriverManagerConnectionFactory;
import org.apache.commons.dbcp2.PoolableConnection;
import org.apache.commons.dbcp2.PoolableConnectionFactory;
import org.apache.commons.dbcp2.PoolingDataSource;
import org.apache.commons.pool2.ObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPool;


public class ConnectionFactory  {
	
    private static interface Singleton {
        final ConnectionFactory INSTANCE = new ConnectionFactory();
    }
    private final DataSource dataSource;
 
    private ConnectionFactory() {
    	
    	Properties prop = new PropertiesUtil("dbconfig.properties").getProperties();
    	
    	Properties properties = new Properties();
        properties.setProperty("user", prop.getProperty("username"));
        properties.setProperty("password", prop.getProperty("password")); // or get properties from some configuration file
    	
    	try 
    	{
           Class.forName("com.mysql.jdbc.Driver");
        } 
        catch (ClassNotFoundException e) 
        {
           e.printStackTrace();
           System.exit(0);
        }
        
        DriverManagerConnectionFactory connectionFactory = new DriverManagerConnectionFactory(prop.getProperty("url"), properties);
        
        PoolableConnectionFactory poolfactory = new PoolableConnectionFactory(connectionFactory, null);
        
	ObjectPool<PoolableConnection> connectionPool = new GenericObjectPool<PoolableConnection>(poolfactory);
        
 
        this.dataSource = new PoolingDataSource<PoolableConnection>(connectionPool);
    }
 
    public static Connection getDatabaseConnection() throws SQLException {
        return Singleton.INSTANCE.dataSource.getConnection();
    }
    
}

上面的类中用到了数据库配置文件中的 3 个值,这里补充一下我的配置文件中这3个值的写法:

url:jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
username:root
password:root

3、配置 log4j2.xml 

(1)、首先新建一个日志表 test_log

包含 3 个字段 id,msg,createtime

DROP TABLE IF EXISTS `test_log`;
CREATE TABLE `test_log`  (
  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `msg` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '日志信息',
  `createtime` datetime(0) NOT NULL COMMENT '日志生成时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

(2)、log4j2.xml 添加 JDBC Appender

<JDBC name="DBLog" tableName="test_log">
      <ConnectionFactory class="com.*.ConnectionFactory" method="getDatabaseConnection" />
      
      <Column name="id" pattern="%X{id}" />
      <Column name="msg" pattern="%m" />
      <Column name="createtime" pattern="%d{yyyy-MM-dd HH:mm:ss}" />
</JDBC>

(3)、log4j2.xml 添加  Logger 并使用 JDBC Appender

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

4、程序中使用 Logger

为了方便测试,这里使用了Spring管理的定时任务,每2秒新增一条日志

public Logger loggerDB = LoggerFactory.getLogger("DBLog");

@Scheduled(cron="0/2 * *  * * ? ")  //每2秒执行一次 
public void testLogDB() {

	MDC.put("id", UuidUtil.get32UUID());

	loggerDB.info("testLogDB");

	System.out.println("testLogDB");

}

5、运行测试

效果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值