发布网友 发布时间:2022-04-30 00:49
共3个回答
懂视网 时间:2022-04-30 05:10
数据库表
表4-1日志表(log)
字段名 |
字段解释 |
数据类型 |
数据 长度 |
是否为空 |
是否为主键 |
是否为外键 |
id |
日志编号 |
bigint |
20 |
否 |
是 |
否 |
create_time |
创建时间 |
datetime |
|
否 |
否 |
否 |
logs |
日志内容 |
varchar |
200 |
否 |
否 |
否 |
数据库创建:
Create database log;
切换数据库:
Use log;
创建表:
CREATE TABLE `log` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `create_time` datetime NOT NULL, `logs` varchar(200) NOT NULL, primary key(`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
新建一个java项目 log4j_write_mysql:
File->new ->java Project:
新建一个测试类Test:
新建一个lib文件,导入log4j的包:
配置log4j配置文件
log4j.rootLogger=ERROR,appender1,appender2 log4j.appender.appender1=org.apache.log4j.ConsoleAppender log4j.appender.appender1.layout=org.apache.log4j.PatternLayout log4j.appender.appender1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss:SSS}[%p]: %m%n log4j.appender.appender2=org.apache.log4j.jdbc.JDBCAppender log4j.appender.appender2.driver=com.mysql.jdbc.Driver log4j.appender.appender2.URL=jdbc:mysql://localhost:3306/log?useUnicode=true&characterEncoding=UTF-8 log4j.appender.appender2.user=root log4j.appender.appender2.password=137151 log4j.appender.appender2.sql=insert into zuidaima_log (create_time,log) VALUES (‘%d{yyyy-MM-dd hh:mm:ss}‘, ‘%c %p %m %n‘) log4j.appender.appender2.layout=org.apache.log4j.PatternLayout
测试类编码:
/** * */ package log4j_write_mysql; import org.apache.log4j.Logger; /** * * 项目名称:log4j_write_mysql * 类名称:Test * 类描述: * 创建人:邓家海 * 创建时间:2015年5月28日 上午1:03:01 * 修改人:deng * 修改时间:2015年5月28日 上午1:03:01 * 修改备注: * @version * */ public class Test { public static Logger log = Logger.getLogger(Test.class); public static void main(String[] args) { try { throw new Exception("最代码错误log"); } catch (Exception e) { log.error(e.getMessage()); } } }
控制台信息:
数据库信息:
改进,整合控制台、日志文件、数据库三个输出:
配置文件代码:
log4j.rootLogger=ERROR,appender1,appender2,log2 log4j.appender.appender1=org.apache.log4j.ConsoleAppender log4j.appender.appender1.Target=System.err log4j.appender.appender1.layout=org.apache.log4j.PatternLayout log4j.appender.appender1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss:SSS}[%p]: %m%n log4j.appender.appender2=org.apache.log4j.jdbc.JDBCAppender log4j.appender.appender2.driver=com.mysql.jdbc.Driver log4j.appender.appender2.URL=jdbc:mysql://localhost:3306/log?useUnicode=true&characterEncoding=UTF-8 log4j.appender.appender2.user=root log4j.appender.appender2.password=137151 log4j.appender.appender2.sql=insert into log (create_time,logs) VALUES (‘%d{yyyy-MM-dd hh:mm:ss}‘, ‘%c %p %m %n‘) log4j.appender.appender2.layout=org.apache.log4j.PatternLayout log4j.appender.log2=org.apache.log4j.FileAppender log4j.appender.log2.file=log.log log4j.appender.log2.layout=org.apache.log4j.PatternLayout log4j.appender.log2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss:SSS}[%p]: %m%n
如需要源代码,请发帖索要:
http://tieba.baidu.com/f?kw=%C8%ED%BC%FE%C6%B5%B5%C0&fr=home
使用log4j把日志写到mysql数据库
标签:
热心网友 时间:2022-04-30 02:18
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:
热心网友 时间:2022-04-30 03:36
你的意思是每产生一条日志就写入数据库?