Log4j2 JDBCAppender的使用
一.缘由
最近打算重新整理一下项目的日志系统,将系统日志和业务日志区分开,然后采用文件或是数据库来存储日志,于是上网查了一下log4j的相关配置,并将系统日志写入了数据库,但是发生了一个bug:
当写入的信息里存在单引号时,数据库就会报错
ORA-00917: 缺失逗号
查了一些资料,发现log4j已经很古老了,它对SQL基本没有做任何处理就执行存储操作,这样SQL里可能存在的一些特殊字符并没有经过处理导致上面的错误.找了好久都没有找到解决办法,所以痛定思痛告别log4j而使用log4j2
二.使用
基本的使用就不累述了,这里有Apache Log4j2官方文档,给firebug装个有道翻译插件,或者直接阅读也没什么难度,这篇博客主要讲述如何配置JDBCAppender(其实文档里也有)
1.web.xml
配置
注意,log4j2.xml
这个名字是默认的,放在resource
目录下的,如果你是采用默认的,那么web.xml
里就不需要配置.
如果需要自定义路径记得在web.xml
里如下配置
<context-param><param-name>log4j2ConfigLocation</param-name><param-value>classpath:config/log4j2.xml</param-value>
</context-param>
2.log4j2.xml的配置
这里仅仅配置了两个输出方式,Console
和JDBC
也就是控制台和数据库,其中com.amayadream.webchat.listener.PoolManager
是一个连接池管理类,getConnection
方法是获取Connection
对象,代码会在下面贴出.
数据库名为syslog
,一共六个字段分别为id
,class
,function
,message
,leavl
,time
,类型都是varchar2
,id
为主键,默认值为sys_guid()
配置中:tableName
是数据库中日志表的表名,Column
是数据库的字段,pattern
是字段的值,因为我用的是oracle
数据库,id
用的是sys_guid()
,所以在这里省略以实现不重复的主键效果.
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO" monitorInterval="1800"><appenders><Console name="consolePrint" target="SYSTEM_OUT"><PatternLayout pattern="%d{HH:mm:ss} [%t] %-5level %logger{36} - %msg%n" /></Console><JDBC name="databaseAppender" tableName="SYSLOG"><ConnectionFactory class="com.amayadream.webchat.listener.PoolManager" method="getConnection" /><!--<Column name="ID" pattern=""/>--><Column name="CLASS" pattern="%C" /><Column name="FUNCTION" pattern="%M" /><Column name="MESSAGE" pattern="%m" /><Column name="LEAVL" pattern="%level" /><Column name="TIME" pattern="%d{yyyy-MM-dd HH:mm:ss.SSS}" /></JDBC></appenders><loggers><root level="info"><appender-ref ref="consolePrint" /><AppenderRef ref="databaseAppender" level="INFO" /></root></loggers>
</Configuration>
3.Connection获取
PoolManager.java
package com.amayadream.webchat.listener;import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;import org.apache.commons.dbcp.ConnectionFactory;
import org.apache.commons.dbcp.DriverManagerConnectionFactory;
import org.apache.commons.dbcp.PoolableConnectionFactory;
import org.apache.commons.dbcp.PoolingDriver;
import org.apache.commons.pool.ObjectPool;
import org.apache.commons.pool.impl.GenericObjectPool;
import org.junit.Test;/*** @author : Amayadream* @date : 2016.04.06 20:17*/
public class PoolManager {private static String driver = "oracle.jdbc.driver.OracleDriver";private static String url = "jdbc:oracle:thin:@localhost:1521:XE";private static String Name = "amayadream";private static String Password = "123456";private static Class driverClass = null;private static ObjectPool connectionPool = null;public PoolManager() {}/*** 装配配置文件*/private static void loadProperties(){try {InputStream stream = PoolManager.class.getClassLoader().getResourceAsStream("jdbc.properties");Properties props = new Properties();props.load(stream);driver = props.getProperty("driver");url = props.getProperty("url");Name = props.getProperty("username");Password = props.getProperty("password");} catch (FileNotFoundException e) {System.out.println("读取配置文件异常");} catch(IOException ie){System.out.println("读取配置文件时IO异常");}}/*** 初始化数据源*/private static synchronized void initDataSource(){if (driverClass == null) {try{driverClass = Class.forName(driver);}catch (ClassNotFoundException e){e.printStackTrace();}}}/*** 连接池启动*/public static void startPool(){loadProperties();initDataSource();if (connectionPool != null) {destroyPool();}try {connectionPool = new GenericObjectPool(null);ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(url, Name, Password);PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory, connectionPool, null, null, false, true);Class.forName("org.apache.commons.dbcp.PoolingDriver");PoolingDriver driver = (PoolingDriver) DriverManager.getDriver("jdbc:apache:commons:dbcp:");driver.registerPool("dbpool", connectionPool);System.out.println("装配连接池OK");} catch (Exception e) {e.printStackTrace();}}public static void destroyPool(){try {PoolingDriver driver = (PoolingDriver) DriverManager.getDriver("jdbc:apache:commons:dbcp:");driver.closePool("dbpool");} catch (SQLException e) {e.printStackTrace();}}/*** 取得连接池中的连接* @return*/public static Connection getConnection() {Connection conn = null;if(connectionPool == null)startPool();try {conn = DriverManager.getConnection("jdbc:apache:commons:dbcp:dbpool");} catch (SQLException e) {e.printStackTrace();}return conn;}/*** 获取连接* getConnection* @param name* @return*/public static Connection getConnection(String name){return getConnection();}/*** 释放连接* freeConnection* @param conn*/public static void freeConnection(Connection conn){if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}/*** 释放连接* freeConnection* @param name* @param con*/public static void freeConnection (String name,Connection con){freeConnection(con);}@Testpublic void test(){try {Connection conn = PoolManager.getConnection();if(conn != null){Statement statement = conn.createStatement();ResultSet rs = statement.executeQuery("select * from syslog");int c = rs.getMetaData().getColumnCount();while(rs.next()){System.out.println();for(int i=1;i<=c;i++){System.out.print(rs.getObject(i));}}rs.close();}PoolManager.freeConnection(conn);} catch (SQLException e) {e.printStackTrace();}}
}
4.jdbc.properties
这里没什么要说的,主要是PoolManager
中getProperties()
中的key要和这里对应
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:XE
username=amayadream
password=123456
#定义初始连接数
initialSize=0
#定义最大连接数
maxActive=20
#定义最大空闲
maxIdle=20
#定义最小空闲
minIdle=1
#定义最长等待时间
maxWait=60000
三.Building…
Log4j2 JDBCAppender的使用相关推荐
- log4j2 xsd_Log4j 2.x XSD的描述不完整
log4j2 xsd 在博客文章JAXB和Log4j XML配置文件中 ,我讨论了"与使用JAXB通过Java类处理[Log4j 1.x和Log4j 2.x] XML配置文件相关的细微差别. ...
- log4j2 配置详解及使用范例
最近项目需求需要将log4j1.2 升级到log4j2,摸索了好久,得出一点经验给大家分享. 1.log4j2 官网下载最新jar包(目前log2j2都是beta版) 导入入log4j-api-2.0 ...
- Spring Boot + Log4j2 日志框架配置 (Maven)
参考Spring Boot官方文档 日志部分 Spring Boot默认情况下,当使用"Starters" 使用Logback输出日志 , 还包括适当的Logback路由, 确保其 ...
- java日志框架JUL、JCL、Slf4j、Log4j、Log4j2、Logback 一网打尽
为什么程序需要记录日志 我们不可能实时的24小时对系统进行人工监控,那么如果程序出现异常错误时要如何排查呢?并且系统在运行时做了哪些事情我们又从何得知呢?这个时候日志这个概念就出现了,日志的出现对系统 ...
- spring、springboot集成 log4j日志、log4j2日志以及slf4j
1.查看pringboot自带的日志框架 新建一个springboot 工程,查看依赖树 通过查看依赖树可以发现,springboot自带被loggong管理的log4j .logback等日志相关的 ...
- Log4j日志配置详解(Log4j2)
Log4j日志配置详解 一.Log4j升级Log4j2 首先来说一下日志升级,log4j配置的变化,配置文件从log4j.xml变成了log4j2.xml,配置文件的内容也有很大不同,log file ...
- Log4j2日志框架
Log4j2日志框架 1.简介及入门示例 1.背景介绍 官网地址:https://logging.apache.org/log4j/2.x/.Maven 仓库地址:https://search.mav ...
- SpringBoot2.1.4整合log4j2保存日志到MySQL中
一.框架版本 springboot2.1.4,log4j2(2.11.2),MySQL5.7 maven依赖请自行上网百度,本文不再赘述,网上大多是基于log4j2-spring.xml方式配置jdb ...
- 在java下使用log4j2记录日志
1.定义: log4j2 指log4j 2.X及以上版本 2.安装 log4j-core-xx.jar log4j-api-xx.jar log4j-web-xx.jar(web项目的需要引用) 3. ...
最新文章
- 售后服务成OA品牌竞争重要因素
- 分布式版本控制系统Git的安装与使用
- 基于人人网的简单爬虫(一)——正则表达式
- java家谱树_青锋家谱系统-基于springboot+orgtree的青锋家谱树管理系统
- Python机器学习工具箱
- curl 安装_实用干货——如何使用curl命令下载文件
- 微信背后的产品观,背后究竟是什么?
- NSSM通俗易懂介绍,安装与使用
- android 谷歌地图显示空白,.android谷歌地图显示空白网格与缩放选项
- pg比mysql优势_postgresql比mysql有多少优势
- 破解华为电脑管家,多屏协同无法正常启动,提示 硬件解码器工作异常,请重启电脑
- 歌词欣赏《一程山水一程歌》
- 蓝牙耳机BES2300P通过盒子获取/修改耳机状态信息
- 科研伦理与学术规范课后答案
- 液金显示器台式计算机耗电量,记笔记本CPU开盖换液金经过
- 【STM32 .Net MF开发板学习-02】GPIO测试
- web gallary
- 2018“人工智能”:是彻底复苏?还是起落轮回?| 抢票
- linux查询网卡是百兆还是千兆,查看网卡是百兆还是千兆
- 计算机网络——学习笔记