log4j 系列09 -- SSM 框架下 slf4j-log4j2 日誌保存到 MySQL 數據庫

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

參考上文,有兩種方法,一種是自建工具類獲取數據庫連接,另一種是調用配置好的連接池獲取數據庫連接。經測試,後一種方法老是報錯,可能是我哪裏沒有配置好,暫時放棄,選用第一種方法。

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、運行測試

效果如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章