问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

使用log4j把日志信息保存到数据库

发布网友 发布时间:2022-04-30 00:49

我来回答

3个回答

懂视网 时间:2022-04-30 05:10

 

1.数据库设计

数据库表

表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;

2.项目准备

新建一个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());
  }
 }
 
}

3:运行结果:

控制台信息:

技术分享

数据库信息:

技术分享

改进,整合控制台、日志文件、数据库三个输出:

技术分享

配置文件代码:

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

你的意思是每产生一条日志就写入数据库?

首先你这个思路有问题,日志别保存进数据库,因为这会增加非常多的插入操作,严重影响性能。
如果你非要保存进数据库,我给你提供一种解决方案:你可以利用Timer类计时,在每天的某个时段将log4j所产生的日志文件存入数据库。这样其实也挺多余,如果你希望做的是在客户端或者浏览器(我不知道你做的是什么项目)查看日志文件,可以通过服务器去读取本地的日志文件(我没记错的话,log4j日志文件命名都是按照固定名字+日期来命名),然后处理一下再显示到客户端或者浏览器。追问先不管性能问题,我就是想把日志信息存储起来,至于以什么方式存储比较好,我现在不管,就是使用log4j 把日志信息存储到mysql数据库日志表中,谁有例子,或者存储到文件都行。有例子的请发一个链接,真的谢谢了

log4j如何记录日志保存到数据库

log4j.rootLogger= XXX,这句是控制日志的输出,如果想吧日志输出到数据库,则需要在XXX中添加“DB”,如log4j.rootLogger=INFO,stdout,Platform,db。上面 这句就是把日志中级别为INFO的信息输出到STDOUT,PLATFORM和DB (DATABASE)中。配置好如上的信息,LOG4J就知道用户是想把信息存入数据库,接下来我们...

如何配置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, ...

log4配置文件怎样写入日志名到数据库中

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...

java怎么将系统日志存到数据库?

log4j支持将日志信息插入数据库,配置一下就可以,不过你的是只插入特定的一部分,应该也能通过配置过滤(写入文件的时候是可以通过配置将特定的日志写入一个文件的),可以参考一下这个http://blog.csdn.net/ziruobing/article/details/3919501

log4j 日志写入数据库主键怎么设置

可能对于一些特殊的数据库必须把insert into和select max(key)或什么序列当前值作为一个事务的原子来操作,但很多数据库(以及数据库操作环境)并不能为你提供事务并发控制.所以如果多人同时操作,那么select max(key)很可能就不是你刚才insert的那条记录.在SQL server 很方便,有现程的sql可以用 INSERT ...

JFinal 如何将操作日志存入到数据库中

3: 在JFinalConfig中:Overridepublic void configConstant(Constants me) { //先启动数据库 ActiveRecordPlugin可以独立于java web 环境运行在任何普通的java程序中,使用方式极度简单,相对于web项目只需要手动调用一下其start() 方法即可立即使用。 //设置为你的工厂 DbLogFactoryme.setLogFactor...

怎么将logback的日志信息异步到oracle数据库

Logback日志需要依赖一下jar包:slf4j-api-1.6.0.jar logback-core-0.9.21.jar logback-classic-0.9.21.jar logback-access-0.9.21.jar 主配置文件为logback.xml,放在src目录下或是WEB-INF/classes下,logback会自动加载 logback.xml的基本结构如下:<?xml version="1.0" encoding="UTF-8"...

java开发怎么做日志功能 就是记录用户每一步的操作具体做什么了_百度...

要记录操作日志,还能查看,那肯定得需要把操作记录保存起来——直接保存到数据库即可。日志管理模块的话,因为有上边的日志记录了,做个删查的功能应该好做。这块就不细说了。 最主要的地方:怎样记录日志。思路如下:先分析好需要记录哪些日志,这个一般都记录新增、修改、删除数据的操作。另外有些特殊的查询操作也要记录...

一文搞懂 Java 日志记录(Log4j/Log4j2)

Log4j2的核心组件包括Logger、Appender和Layout,它们协同工作,允许开发者将日志信息定向到文件、控制台甚至数据库。Logger负责接收和处理日志信息,Appender决定输出目的地,而Layout则负责格式化输出。配置文件如log4j.properties,可通过XML或properties格式,定义日志级别、目标以及输出格式。在编写Java应用时,...

Log日志框架简介(log4j、logback、MDC链路追踪)

实际项目中,注意日志库选择,避免多库共存导致的输出异常。日志库如log-jdk、log4j和logback支持将日志输出至控制台、文件、数据库、邮件、socket和mq等。MDC(Mapped Diagnostic Context)是Slf4j提供的一种多线程条件下的日志记录功能。MDC可以看作与当前线程绑定的Map,用于存储键值对,这些内容能被当前...

log4j日志不输出到数据库 闲时保存日志到数据库 存日志用什么数据库 日志数据传入数据库 log4j持久化到数据库 log4j输出sql日志到文件 业务日志存数据库 日志适合什么数据库 日志系统写入数据库
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
富贵不能淫,英文解析 海信电视为什么没台 海信电视搜完台后有台子然后关机重启后就没有台子了是不会自己选择信号... 我家的海信电视,我按信号源键想调回去但是按错了按到了频道里面随便点了... ...性(要求:器材,步骤,现象,结论)拜托了各位 谢谢 为什么新疆牧区行政区划存在大量分散特征,比如阿勒泰地区一个乡镇... 阿勒泰地区青河县以前的乡镇为什么分为一区和二区呢 阿勒泰历史沿革 hawk的讲解 取个英文名字,大家给点意见吧~ 女人的颜色里妞妞是谁的亲生女儿 40位留守儿童组成妞妞合唱团走红网络,能走到这一步最应该感谢谁? 谁有黑Girl的资料! 贾静雯的网站有哪些? 黑涩会美眉与棒棒堂资料 女人的颜色妞妞谁演的 人人网上的巴别小精灵兔几妞妞旁边的那个小东西是什么呀? 女人颜色妞妞叫什么 有没有其他妞妞演的电视剧 他的图片 分析数据库的介绍 这个是不是日本妞妞写真?谁知她叫什么名字? 分析数据库的简介 谁的青春有我狂 最适合数据分析师的数据库为什么不是MySQL 请问,黑色跟黄色配出来是什么色啊??在线等答案!! 女人的颜色妞妞扮演者 分析类中的实体类可不可以理解成数据库中的表的 女人的颜色中叶静怡怎么不知道妞妞身世 紫色配绿色是什么颜色? 为什么女主角叫秃妞妞? 请问有效期多久,普通话证书 大家知道松鼠AI智适应教育吗?是一家什么机构? 交通银行信用卡 取现额度是什么意思 交通银行信用卡取现的额度是多少 交通银行信用卡最多可取多少现金呀? 交行信用卡取现额度和信用额度 交通银行信用卡取现问题 我的取现额度是9000 交通银行信用卡的信用额度是2000、取现是2000,请问下我可以刷多少钱?和取现多少钱? 交通银行信用卡可用取现额度可以全部取现吗 我的交行信用卡信用额度和取现额度是什么意思? 急急急急 我交通银行信用卡额度是一万,为什么只能取现4000 交通银行信用卡取现额度问题 使用log4j将日志写入到mysql,如何设置使得当数量超过10000条的时候以前的记录自动删除? 谢谢 德国鹿头啤酒什么牌子 一个女孩和一只鹿什么啤酒 作业帮直播课能上课吗 保健品上的鹿头标志什么意思 谁能翻下:Sie sind das essen und wir sind die Jager! 鹿头牌注册过商标吗?还有哪些分类可以注册? 鹿头标志是什么? 这标志是什么意思