Log4j记录日志到数据库
1.自定义输出消息
/**
* 参数化消息
* @author Johnson.Lee
*
*/
public interface ParameterizedMessage extends Serializable { /**
* 获取参数列表
* @return 返回参数列表
*/
public Object[] getParameters(); /**
* 获取指定索引位置的参数
* @param index 索引位置
* @return 返回参数列表中指定索引位置的参数值
* @throws IndexOutOfBoundsException 当index >= 参数列表个数时,抛出此异常
* @see #getParameterCount()
*/
public Object getParameter(int index) throws IndexOutOfBoundsException; /**
* 获取参数个数
* @return 返回参数个数
*/
public int getParameterCount(); }
/**
* JDBC日志消息
* @author Johnson.Lee
*
*/
public class JDBCLogMessage implements ParameterizedMessage {
private static final long serialVersionUID = 1709063421963292637L;
private Object[] params; public JDBCLogMessage(Object... params) {
this.params = params;
} public Object[] getParameters() {
return this.params;
} public Object getParameter(int index) throws IndexOutOfBoundsException {
return this.params[index];
} public int getParameterCount() {
return this.params.length;
} @Override
public String toString() {
return Arrays.toString(this.params);
}
}
2.继承Log4j的AppenderSkeleton
/**
* 使用纯JDBC连接将日志记录到数据库中
* @author Johnson.Lee
*
*/
public class JDBCAppender extends AppenderSkeleton {
private String driver;
private String url;
private String userName;
private String password;
private String sql; @Override
protected void append(LoggingEvent e) {
Connection conn = null;
PreparedStatement pstmt = null;
try {
Class.forName(this.driver);
conn = DriverManager.getConnection(this.url, this.userName, this.password);
if (e.getMessage() instanceof ParameterizedMessage) {
try {
pstmt = conn.prepareStatement(sql);
Object[] params = ((ParameterizedMessage) e.getMessage()).getParameters();
for (int i = 0; i < params.length; i++) {
pstmt.setObject(i + 1, params[i]);
}
pstmt.executeUpdate();
} catch (SQLException ex) {
this.errorHandler.error("log into database failed!", ex, 0);
} finally {
AbstractJDBCDao.close(pstmt);
AbstractJDBCDao.close(conn);
}
}
} catch (ClassNotFoundException ex) {
this.errorHandler.error("load jdbc driver [" + this.driver + "] failed!", ex, 0);
} catch (SQLException ex) {
this.errorHandler.error("establish connect failed!", ex, 0);
}
} @Override
public void close() {
} @Override
public boolean requiresLayout() {
return false;
} /**
* 设置JDBC驱动
* @param driver JDBC驱动类名
*/
public void setDriver(String driver) {
this.driver = driver;
} /**
* 设置连接字符串
* @param url 数据库连接字符串
*/
public void setUrl(String url) {
this.url = url;
} /**
* 设置数据库用户名
* @param userName 用户名
*/
public void setUserName(String userName) {
this.userName = userName;
} /**
* 设置数据库密码
* @param password 密码
*/
public void setPassword(String password) {
this.password = password;
} /**
* 设置插入日志的SQL语句
* @param sql
*/
public void setSql(String sql) {
this.sql = sql;
} }
3.配置log4j.properties
log4j.rootLogger=INFO, stdout, jdbc #std appender
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n #file appender
#log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.file.File=${application.context}
#log4j.appender.file.DatePattern='_'yyyyMMdd'.log'
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%d %p [%c] - %m%n #jdbc appender
log4j.appender.jdbc=net.kinginfo.framework.log.JDBCAppender
log4j.appender.jdbc.driver=com.microsoft.jdbc.sqlserver.SQLServerDriver
log4j.appender.jdbc.url=jdbc:microsoft:sqlserver://192.172.10.106:1433;databaseName=tempdb
log4j.appender.jdbc.userName=sa
log4j.appender.jdbc.password=sa
log4j.appender.jdbc.sql=insert into LogInfo(time, type, info) values(getDate(),?,?)
4.创建日志表
use tempdb; create table LogInfo (
id int identity(1,1) primary key not null,
time datetime,
type int,
info varchar(255)
); select * from LogInfo;
5.编写测试类
public class TestJDBCAppender {
public static void main(String[] args) {
Logger logger = Logger.getRootLogger();
ParameterizedMessage msg = new JDBCLogMessage(1, "日志测试");
logger.info(msg);
}
}
Log4j记录日志到数据库的更多相关文章
- [转]C# 使用Nlog记录日志到数据库
本文转自:http://www.cnblogs.com/weixing/archive/2013/04/26/3044422.html 摘要]Nlog是一个很不错的.NET日志记录组件,它可以将日志输 ...
- 浅谈如何使用Log4j记录日志
一.什么是log4j Log4J是Apache的一个开放源代码的项目.通过使用Log4J,程序员可以控制日志信息输送的目的地,包括控制台,文件,GUI组件和NT事件记录器,也可以控制每一条日志的输出格 ...
- C# 使用Nlog记录日志到数据库 使用LogEventInfo类获取,命名空间名称、类名、方法名
原文地址:http://dotnet.9sssd.com/csbase/art/793 [摘要]Nlog是一个很不错的.NET日志记录组件,它可以将日志输出到控件台,保存到文本,也可以很方便的记录到数 ...
- 将WebService部署到 SharePoint 2010 gac 缓存中,并用Log4Net记录日志到数据库
最近做了一个sharePoint项目,需要实现的功能是,第三方网站访问我们sharePoint中的数据,通过Webservice方式实现文件的上传和下载. 于是代码工作完成了之后,本地调试没什么问题, ...
- C# 使用Nlog记录日志到数据库
[摘要]Nlog是一个很不错的.NET日志记录组件,它可以将日志输出到控件台,保存到文本,也可以很方便的记录到数据库中.本文为你介绍C# 使用Nlog记录日志到数据库. Nlog是一个很不错的.NET ...
- JAVA中使用LOG4J记录日志(转)
在项目开发中,记录错误日志是一个很有必要功能.一是方便调试:二是便于发现系统运行过程中的错误:三是存储业务数据,便于后期分析: 在java中,记录日志,有很多种方式. 比如,自己实现. 自己写类,将日 ...
- JAVA中使用LOG4J记录日志
在项目开发中,记录错误日志是一个很有必要功能.一是方便调试:二是便于发现系统运行过程中的错误:三是存储业务数据,便于后期分析: 在java中,记录日志,有很多种方式. 比如,自己实现. 自己写类,将日 ...
- Log4j记录日志步骤
记录日志对调试Bug很有帮助 亲身体会 个人习惯用Log4J,大家可以在apache网站:jakarta.apache.org/log4j 可以免费下载到Log4j最新版本的软件包. Log4j支持 ...
- log4j+mybatis打印数据库日志
参考文献:一:http://blog.csdn.net/rangqiwei/article/details/50825090 二:http://www.mybatis.org/mybatis-3/zh ...
随机推荐
- 历届试题 带分数 全排列模板 JAVA
标题:带分数 100 可以表示为带分数的形式:100 = 3 + 69258 / 714 还可以表示为:100 = 82 + 3546 / 197 注意特征:带分数中,数字1~9分别出现且只出现一次( ...
- 重复造轮子系列--内存池(C语言)
这个代码是我上个公司工作项目的里面内存管理(基于伙伴算法)的一个简化又简化的版本. 因为没有内存边界检查: 因为没有内存使用统计: 因为没有考虑线程安全: 因为没有内存分配操作的具体文件位置信息: 因 ...
- 第一次使用iptables
sudo iptables -A OUTPUT -m cgroup ! --cgroup 0x100001 -j DROP 第一次使用iptables就把电脑弄得上不了网了...... 下面这个地址讲 ...
- TypeScript 3.0下react默认属性DefaultProps解决方案
ts和react的默认属性的四种解决方案 Non-null assertion operator(非空断言语句) Component type casting(组件类型重置) High order f ...
- ZooKeeper概述与安装
ZooKeeper笔记 ZooKeeper概述 背景: 现代企业对计算机系统的计算存储能力要求越来越高,单纯的高性能服务器已经无法满足要求.企业的IT架构从集中式向分布式过度. 所谓分布式,就是将一个 ...
- [TJOI2017][bzoj4889] 不勤劳的图书管理员 [线段树套线段树]
题面 传送门 思路 考虑两本书的位置交换对答案的贡献: (为了方便描述,用"左边那本"和"右边那本"称呼两本我们要交换的书,"中间那本"是我 ...
- 深入解析Vuex实战总结
这篇文章主要介绍了Vuex的初探与实战小结,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下.如有不足之处,欢迎批评指正. 1.背景 最近在做一个单页面的管理后台项目,为了提高开 ...
- [codeforces] 578C Weakness and Poorness || 三分
原题 题目定义了两个变量: poorness表示一个区间内和的绝对值. weakness表示一个所有区间最大的poornesss 题目要求你求一个x使得 a1 − x, a2 − x, ..., an ...
- BZOJ2125 最短路 【仙人掌最短路】
题目 给一个N个点M条边的连通无向图,满足每条边最多属于一个环,有Q组询问,每次询问两点之间的最短路径. 输入格式 输入的第一行包含三个整数,分别表示N和M和Q 下接M行,每行三个整数v,u,w表示一 ...
- 【POJ 2728 Desert King】
Time Limit: 3000MSMemory Limit: 65536K Total Submissions: 27109Accepted: 7527 Description David the ...