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