本文目录一览:
使用log4j把日志信息保存到数据库
log4j 包里面有一个 SQL 的 appender ,但我知道以前的版本中有bug,因为它生成 SQL 时用的是 createStatement 拼接字符串而不是 PreparedStatement ,因此当消息内容中有单引号或特殊符号时 SQL 都有语法错误执行不成功。
你需要自己扩展一下它提供自己的 SQLAppender 来做这件事。在网上搜索一个像 decompiler 这样的 Java 反编译器或从 Apache 网站去下载 log4j 源码来看一下 SQL appender 是怎么样的,我们改写它把这个 bug 解决了就可以用了。
如果你打算用 ODBC 数据源而不是 JDBC 来做,你需要确保你的 JRE 是 Oracle / Sun 提供的,因为像 IBM 的 JRE 就没有自带 ODBC 驱动程序,或者你自己去手工下载第三方的 ODBC 驱动程序。
从你的错误消息说 数据源找不到,对比下面这个图片,你没有设置它的 driver 参数,左边所有以 set 开头的方法就是表示你在 log4j.properties 文件中可以给它设置的参数,比如,setPassword 表示这个 JDBC Appender 有一个属性 password。
log4j.appender.mySQLAppender.password = 密码
log4j.appender.mySQLAppender.user = 用户名
。。。 其它 set 方法对应的属性列举在这里。。。
依此类推。
我们需要纠正的 bug 在这里面,你需要提供自己的类继承原来的 JDBCAppender 把这个 statement 改成 PreparedStatement 来访问数据库,就是需要 stmt.setString(1, myMsg); 这种,而不是直接拼接字符串的。
看了它的 JDBCAppender.execute 方法就知道这里有一个 bug:
如何配置log4j2日志记录至数据库
配置log4j2日志记录至数据库
1、建立用于保存日志的数据库表:
CREATE TABLE `sys_log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`level` varchar(32) NOT NULL,
`logger` varchar(100) NOT NULL,
`message` varchar(1000) DEFAULT NULL,
`exception` varchar(10000) DEFAULT NULL,
`date_add` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8mb4;
2、配置 databaseAppender :
JDBC name="databaseAppender" tableName="sys_log"
ConnectionFactory class="cc.s2m.web.s2mBlog.util.StaticProp" method="getDatabaseConnection" /
Column name="date_add" isEventTimestamp="true" /
Column name="level" pattern="%level" /
Column name="logger" pattern="%logger" /
Column name="message" pattern="%message" /
Column name="exception" pattern="%ex{full}" /
/JDBC
3、其中 cc.s2m.web.s2mBlog.util.StaticProp 类的getDatabaseConnection方法为获取可用的datasource:
DriverManagerDataSource ds = new DriverManagerDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://127.0.0.1/s2mBlog?characterEncoding=utf8");
ds.setUsername("root");
ds.setPassword("123456");
return ds.getConnection();
4、指派需要记录的日志,使用 databaseAppender 即可:
logger name="SYSLOG" level="INFO" additivity="false"
appender-ref ref="databaseAppender"/
/logger
springMVC怎么使用log4j将数据写到数据库
view
plainprint?CREATE02TABLE02log02(02020202[Id]02[int]02IDENTITY02(1,021)02primary02key02NOT02NULL02,02020202[Lg_Date]02[datetime]02NOT02NULL02,02020202[Lg_Thread]02[varchar]02(50)02COLLATE02Chinese_PRC_CI_AS02NOT02NULL02,02020202[Lg_Level]02[varchar]02(20)02COLLATE02Chinese_PRC_CI_AS02NOT02NULL02,02020202[Lg_Class]02[varchar]02(200)02COLLATE02Chinese_PRC_CI_AS02NOT02NULL02,02020202[Lg_Message]02[varchar]02(2000)02COLLATE02Chinese_PRC_CI_AS02NOT02NULL0202)0202GO02022.写log4j.properties文件,这里我的数据库举动是用的JTDS:
引用#
level
:
是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。
#
Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。
log4j.rootLogger=ERROR,DATABASE
log4j.addivity.org.apache=true
#
用于数据库
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:jtds:sqlserver://localhost:1433;DatabaseName=databasename
log4j.appender.DATABASE.driver=net.sourceforge.jtds.jdbc.Driver
log4j.appender.DATABASE.user=username
log4j.appender.DATABASE.password=password
#
本处设置为"WARN"以上级别在数据库存储(默认情况使用rootLogger中的设置)
log4j.appender.DATABASE.Threshold=DEBUG
log4j.appender.DATABASE.sql=INSERT
INTO
log(optime,thread,infolevel,class,message)
VALUES
('%d{yyyy-MM-dd
HH:mm:ss}',
'%t',
'%p',
'%l',
'%m')
#
写入数据库中的表LOG4J的Message字段中,
#
内容%d(日期)%c:
日志信息所在地(类名)%p:
日志信息级别%m:
产生的日志具体信息
%n:
输出日志信息换行
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=[framework]
%d
-
%c
-%-4r
[%t]
%-5p
%c
%x
-
%m%n3.在程序中需要将日志信息写入数据库的地方写入如下代码:
view
plainprint?