一.缘由

最近打算重新整理一下项目的日志系统,将系统日志和业务日志区分开,然后采用文件或是数据库来存储日志,于是上网查了一下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的配置

这里仅仅配置了两个输出方式,ConsoleJDBC也就是控制台和数据库,其中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

这里没什么要说的,主要是PoolManagergetProperties()中的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的使用相关推荐

  1. log4j2 xsd_Log4j 2.x XSD的描述不完整

    log4j2 xsd 在博客文章JAXB和Log4j XML配置文件中 ,我讨论了"与使用JAXB通过Java类处理[Log4j 1.x和Log4j 2.x] XML配置文件相关的细微差别. ...

  2. log4j2 配置详解及使用范例

    最近项目需求需要将log4j1.2 升级到log4j2,摸索了好久,得出一点经验给大家分享. 1.log4j2 官网下载最新jar包(目前log2j2都是beta版) 导入入log4j-api-2.0 ...

  3. Spring Boot + Log4j2 日志框架配置 (Maven)

    参考Spring Boot官方文档 日志部分 Spring Boot默认情况下,当使用"Starters" 使用Logback输出日志 , 还包括适当的Logback路由, 确保其 ...

  4. java日志框架JUL、JCL、Slf4j、Log4j、Log4j2、Logback 一网打尽

    为什么程序需要记录日志 我们不可能实时的24小时对系统进行人工监控,那么如果程序出现异常错误时要如何排查呢?并且系统在运行时做了哪些事情我们又从何得知呢?这个时候日志这个概念就出现了,日志的出现对系统 ...

  5. spring、springboot集成 log4j日志、log4j2日志以及slf4j

    1.查看pringboot自带的日志框架 新建一个springboot 工程,查看依赖树 通过查看依赖树可以发现,springboot自带被loggong管理的log4j .logback等日志相关的 ...

  6. Log4j日志配置详解(Log4j2)

    Log4j日志配置详解 一.Log4j升级Log4j2 首先来说一下日志升级,log4j配置的变化,配置文件从log4j.xml变成了log4j2.xml,配置文件的内容也有很大不同,log file ...

  7. Log4j2日志框架

    Log4j2日志框架 1.简介及入门示例 1.背景介绍 官网地址:https://logging.apache.org/log4j/2.x/.Maven 仓库地址:https://search.mav ...

  8. SpringBoot2.1.4整合log4j2保存日志到MySQL中

    一.框架版本 springboot2.1.4,log4j2(2.11.2),MySQL5.7 maven依赖请自行上网百度,本文不再赘述,网上大多是基于log4j2-spring.xml方式配置jdb ...

  9. 在java下使用log4j2记录日志

    1.定义: log4j2 指log4j 2.X及以上版本 2.安装 log4j-core-xx.jar log4j-api-xx.jar log4j-web-xx.jar(web项目的需要引用) 3. ...

最新文章

  1. 售后服务成OA品牌竞争重要因素
  2. 分布式版本控制系统Git的安装与使用
  3. 基于人人网的简单爬虫(一)——正则表达式
  4. java家谱树_青锋家谱系统-基于springboot+orgtree的青锋家谱树管理系统
  5. Python机器学习工具箱
  6. curl 安装_实用干货——如何使用curl命令下载文件
  7. 微信背后的产品观,背后究竟是什么?
  8. NSSM通俗易懂介绍,安装与使用
  9. android 谷歌地图显示空白,.android谷歌地图显示空白网格与缩放选项
  10. pg比mysql优势_postgresql比mysql有多少优势
  11. 破解华为电脑管家,多屏协同无法正常启动,提示 硬件解码器工作异常,请重启电脑
  12. 歌词欣赏《一程山水一程歌》
  13. 蓝牙耳机BES2300P通过盒子获取/修改耳机状态信息
  14. 科研伦理与学术规范课后答案
  15. 液金显示器台式计算机耗电量,记笔记本CPU开盖换液金经过
  16. 【STM32 .Net MF开发板学习-02】GPIO测试
  17. web gallary
  18. 2018“人工智能”:是彻底复苏?还是起落轮回?| 抢票
  19. linux查询网卡是百兆还是千兆,查看网卡是百兆还是千兆
  20. 计算机网络——学习笔记

热门文章

  1. Python矩阵计算-Numpy
  2. unity内部自带局域网制作
  3. 去中心化的区块链如何理解?
  4. 计算机专业该如何学习:准大一篇
  5. 生产质量分析方案,人机料法环全面解析,必看好文
  6. linux操作系统是什么,操作系统概述
  7. 实习每日总结_20161214
  8. Odoo(OpenERP)应用实践:代发货管理
  9. 数据结构笔记(王道考研) 第五章:树和二叉树
  10. 基于selenium的码市外包信息爬虫