Log4j 配置数据库连接池(将日志信息保存到数据库)

 org.apache.log4j.jdbc.JDBCAppender 是利用传统的 JDBC 连接方法,这种方式连接数据库效率低下,为了解决这个问题,现在自定义一个 Log4j 的 Appender, 将数据库连接改为连接池的形式,此 Appender 继承自 org.apache.log4j.jdbc.JDBCAppender, 并运用了开源项目Poolman(可从http://nchc.dl.sourceforge.net/project/poolman/PoolMan/poolman-2.1-b1/poolman-2.1-b1.zip 下载)数据库连接池的包。


    org.apache.log4j.jdbc.JDBCAppender 的官方 API(http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/jdbc/JDBCAppender.html ) 中有这么一段话:

WARNING: This version of JDBCAppender is very likely to be completely replaced in the future. Moreoever, it does not log exceptions . The JDBCAppender provides for sending log events to a database.

Each append call adds to an ArrayList buffer. When the buffer is filled each log event is placed in a sql statement (configurable) and executed. BufferSize , db URL , User , & Password are configurable options in the standard log4j ways.

The setSql(String sql) sets the SQL statement to be used for logging -- this statement is sent to aPatternLayout (either created automaticly by the appender or added by the user). Therefore by default all the conversion patterns in PatternLayout can be used inside of the statement. (see the test cases for examples)

Overriding the getLogStatement(org.apache.log4j.spi.LoggingEvent) method allows more explicit control of the statement used for logging.

For use as a base class:

  • Override getConnection() to pass any connection you want. Typically this is used to enable application wide connection pooling.
  • Override closeConnection(Connection con) -- if you override getConnection make sure to implement closeConnection to handle the connection you generated. Typically this would return the connection to the pool it came from.
  • Override getLogStatement(LoggingEvent event) to produce specialized or dynamic statements. The default uses the sql option value.

大概意思就是建议我们把其提供的 org.apache.log4j.jdbc.JDBCAppender 作为基类来使用,然后 Override 这三个方法: getConnection()、 closeConnection(Connection con) 和 getLogStatement(LoggingEvent event)。

下面是我写的一个 org.apache.log4j.jdbc.JDBCAppender 的子类:

 

package com.hmw.log4j;  

import java.sql.Connection;  

import java.sql.SQLException;  

import org.apache.log4j.spi.ErrorCode;  

import com.codestudio.sql.PoolMan;  

/** 

 * Log4j的 Appender, 通过连接池获取数据库连接 

 * @author Carl He 

 */  

public class MyJDBCAppender extends org.apache.log4j.jdbc.JDBCAppender {  

    /**通过 PoolMan 获取数据库连接对象的 jndiName 属性*/  

    protected String jndiName;  

    /**数据库连接对象*/  

    protected Connection connection;  

    public MyJDBCAppender() {  

        super();  

    }  

    @Override  

    protected void closeConnection(Connection con) {  

        try {  

            if (connection != null && !connection.isClosed())  

                connection.close();  

        } catch (SQLException e) {  

            errorHandler.error("Error closing connection", e, ErrorCode.GENERIC_FAILURE);  

        }  

    }  

    @Override  

    protected Connection getConnection() throws SQLException {  

        try {  

            //通过 PoolMan 获取数据库连接对象(http://nchc.dl.sourceforge.net/project/poolman/PoolMan/poolman-2.1-b1/poolman-2.1-b1.zip)  

            Class.forName("com.codestudio.sql.PoolMan");  

            connection= PoolMan.connect("jdbc:poolman://" + getJndiName());  

        } catch (Exception e) {  

            System.out.println(e.getMessage());  

        }  

        return connection;  

    }  

    /** 

     * @return the jndiName 

     */  

    public String getJndiName() {  

        return jndiName;  

    }  

    /** 

     * @param jndiName the jndiName to set 

     */  

    public void setJndiName(String jndiName) {  

        this.jndiName = jndiName;  

    }  

}  

log4j.properties 文件中加上如下一段代码(对此 Appender 的配置):

log4j.appender.JDBC=com.hmw.log4j.MyJDBCAppender  

log4j.appender.JDBC.jndiName=log  

log4j.appender.JDBC.layout=org.apache.log4j.PatternLayout  

log4j.appender.JDBC.sql=INSERT INTO LOGGING (log_date, log_level, location, message) VALUES ('%d{ISO8601}', '%-5p', '%C,%L', '%m')

最后不要忘了 PoolMan 的配置文件 poolman.xml:

 

<?xml version="1.0" encoding="UTF-8"?>  

<poolman>  

    <management-mode>local</management-mode>  

    <datasource>  

        <dbname>log</dbname>  

        <jndiName>log</jndiName>  

        <driver>com.mysql.jdbc.Driver</driver>  

        <url>jdbc:mysql://localhost:3306/test</url>  

        <username>use</username>  

        <password>password</password>  

        <minimumSize>0</minimumSize>  

        <maximumSize>10</maximumSize>  

        <logFile>logs/mysql.log</logFile>  

    </datasource>  

</poolman>  

  

 

 

配置log4j配置数据库连接池(以dbcp连接池为例),并将log信息存储在数据库中(以mysql为例) 立即下载

相关推荐

7 series FPGAs Transceiver Wizard IP核使用和测试

学习FPGA一段时间了,前面一直没有系统的总结,这学期把在项目中用到的IP核和一些调试过程中遇到的问题总结一下发出来,坚持下去,一起进步! 今天总结一下的GTH核的使用和测试。 软件版本:Vivado 2017.4 IP核版本:7 Series FPGAs Transceivers Wizard (3.6) FPGA:xc7vx690tfft1927 实现功能: 四路光纤数据接收,由于GTX IP...

qq_39921762的博客 1万+

测试是否连接数据库,并打印日志

1.新建module 2.构建如下目录,项目目录下新建libs文件夹,将mysql驱动jar包拷贝到里面,然后,右键add as library 3.JDBCUtils.java import java.sql.*; public class JDBCUtils { public static Connection getConnection() { Stri...

Jak的博客 624

贝塞尔曲线原理--曲线生成--路径规划--matlab代码

贝塞尔曲线有着很多特殊的性质, 在图形设计和路径规划中应用都非常广泛, 在路径规划中贝塞尔曲线完全由其控制点决定其形状, n个控制点对应着n-1阶的贝塞尔曲线,并且可以通过递归的方式来绘制.

bob595078694的博客 1万+

MySQL笔记:第17章_其他数据库日志

第17章_其他数据库日志1.MySQL支持的日志1.1日志类型1.2日志的弊端2.慢查询日志(slow query log) 我们在讲解数据库事务时,讲过两种日志:重做日志、回滚日志。 对于线上数据库应用系统,突然遭遇数据库宕机怎么办?在这种情况下,定位宕机的原因就非常关键。可以查看数据库的错误日志。因为日志中记录了数据库运行中的诊断信息,包括了错误、警告和注释等信息。比如:从日志中发现某个连接中的SQL操作发生了死循环,导致内存不足,被系统强行终止了。明确了原因,处理起来也就轻松了,系统很快就恢复了运行。

IAMLSL的博客 2656

第0章 《机器人工程师带你入门SLAM》专栏所有文章目录汇总(截止目前115篇文章),方便大家查看阅读

《机器人工程师带你入门SLAM》专栏文章汇总:优快云热销专栏已更新100+篇优质内容,涵盖SLAM技术全栈知识体系。文章分为三大类:1)基础工具与环境配置,包括Ubuntu、Git等必备技能;2)C++编程从入门到进阶,详解变量、类、模板等核心概念;3)SLAM核心库实战,深入解析ROS、Eigen、PCL等关键库的应用。专栏提供从计算机基础到项目实战的系统学习路径,并附代码实例。点击专栏主页可订阅查看全部内容,后续将保持更新。

行知SLAM 1068

[QMT量化交易小白入门]-二十八、有了回测年化收益好的策略,如何在QMT量化实盘呢(附python代码解析)

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步,自己淋过雨了,希望大家都有一把伞。

木头大左的博客 2927

Spring boot2 项目配置log4j2,druid连接池和fastjson(一)

以前自己练手项目,没有配置好log4j和druid连接池,工作的项目发现工程中虽然引入了fastjson,但没有生效,还是要用jackson。这段时间,自己要搭建一个练手项目,现在逻辑不是重点,重点是一些不会的东西。 网上的资料很多,但坑也非常多,正好记录一下最近遇到的坑。在本文最后,我会贴出参考文章的地址。 里面一些细节我其实也不太懂,都是复制粘贴来,只保证能跑,不保证最优。如果有问题,请大神指...

heheyixiao233的博客 1537

大模型选型实战:为OpenClaw匹配最优“大脑”的全维度考量

大模型不是越贵越好,也不是参数越高越好,适合自己的使用场景才是最好的。按照我的方法,先明确自己的需求,再选对应的模型,配置多模型自动路由,既能保证体验,又能最大限度降低成本。我自己用这套配置用了半年多,不管是写文章、写代码还是处理复杂问题,都完全够用,成本也很低,大家可以参考一下。如果不知道选什么模型,可以在评论区说一下你的使用场景。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 343

druid监控数据转存mysql_druid:保存监控记录

druid的datasource会记录下关于连接池各种信息,包括活动连接、已关闭连接、历史连接数,连接池的总连接数等等,同时支持将这些监控信息保存下来。这个功能通过datasource的DruidDataSourceStatLogger实例statLogger来支持,DruidDataSource初始化的时候会创建一个LogStatsThread线程,这个线程每隔一定的时间就会将监控信息保存到特定...

weixin_39684454的博客 1137

我的AI个人公司成立:基于Skills与Qwen大模型的智能问答平台实战开发+龙虾团队

微学AI推出数字员工矩阵,包含10个核心AI角色(总经理、秘书、工程师等),每个角色具备专属技能模块。系统采用FastAPI+Vue3技术栈,核心功能包括:基于SkillLoader的动态技能管理(支持脚本执行和文档加载)、WebSocket流式输出、多轮对话上下文管理。通过模块化架构实现AI自驱协作,可自主完成从需求分析到开发落地的全流程。项目亮点在于声明式技能配置和实时交互能力,打破传统办公壁垒,提升工作效率。

微学AI的博客 1625

Vue3 - 完美解决高德地图定位失败 Get ipLocation failed.Geolocation permission denied.(获取ipLocation失败。地理定位权限被拒绝。)

Get ipLocation failed.Geolocation permission denied.,vue3引入高德地图当前定位失败 ,vue3中使用高德地图定位报错,高德地图API用户定位失败,高德地图H5 定位失败报错排查和解决方案,微信公众号H5网页高德地图定位报错,谷歌浏览器-高德地图定位失败geolocation,getCurrentPosition 返回的 message报错,如何解决此问题,uniapp h5高德地图,微信、QQ等内置浏览器定位失败,高德地图实现实时用户位置定位,引入高德

🏆 前端领域优质创作者 4172

log4j 记录日志,数据插入到数据库

MDC log4j 记录日志 并将数据插入到数据库 log4j.rootLogger = DEBUG, DB log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender log4j.appender.DB.layout=org.apache.log4j.PatternLayout

L1ShuangLu的博客 5265

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Springboot配置Log4j日志系统,并将日志存入数据库

Log4j是apache公司开发的一款日志管理系统,可以高效的管理系统中出现的BUG或者各种信息,并且可以已文本的方式或者数据库存入的方式来记录数据。

周彰健的博客 5582

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

log4j 系列09 -- SSM 框架下 slf4j-log4j2 日志保存到 MySQL 数据库

https://blog.youkuaiyun.com/m0_37459403/article/details/86501151 参考上文,有两种方法,一种是自建工具类获取数据库连接,另一种是调用配置好的连接池获取数据库连接。经测试,后一种方法老是报错,可能是我哪里没有配置好,暂时放弃,选用第一种方法。 【关键点: 两个工具类 + POM.xml】 1、创建读取数据库 properties配置 的 工具...

NRGAGA的专栏 707

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

log4j日志保存数据库

1、不使用数据源 <appender name="DB_INFO" class="org.apache.log4j.jdbc.JDBCAppender"> <param name="Threshold" value="INFO"/> <param name="BufferSize" value="1...

dengyiyu5280的博客 88

配置数据源、数据库连接池、log4j、Junit单元测试

先贴个hibernate.cfg.xml<?xml version="1.0"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/

zytdoit的博客 885

springboot log4j2+mongodb pool实现日志记录到mongodb数据库中,自定义字段信息ThreadContext

环境 idea 2019.2 springboot版本 2.2.2.RELEASE 阿里云 mongodb 项目结构 maven依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001...

a704397849的博客 775

14_log4j日志框架

d:输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,如:%d{yyyy/MM/dd HH:mm:ss,SSS}。日志可以记录程序的运行状态,运行信息,用户的一些常用操作.日志可以帮助我们分析程序的运行状态,帮我们分析用户的操作习惯,进而对程序进行改进。%l:输出日志事件的发生位置,相当于%c.%M(%F:%L)的组合,包括类全名、方法、文件名以及在代码中的行数。%p:输出日志信息的优先级,即DEBUG,INFO,WARN,ERROR,FATAL。

wei7a7a7a的博客 132

log4j 格式化mysql sql语句_log4j+JDBC+mySQL 将对象写入数据库

一、写前唠叨最近写了一个关于将对象通过log4j的形式保存到数据库的例子,因对这个log4j正在入门,所以做之前查过很多资料,不过网上的信息比较简单,如下:1.所有信息几乎全部在配置文件中进行获取,如:数据库相关的连接、用户名、密码、sql语句;日志相关的appender、输出、格式化、参数;2.写到数据库中的仅是一个字符串而不是一个对象,如:将一个对象本身以及它的各个数据作为一条记录存到数据库3...

weixin_39965161的博客 346

在LOG4J中把日志写入远程数据库

LOG4J强大的功能让我爱不释手,为了不用跑到机房看日志,我打算把日志写入远程数据库,这样操作起来就方便了,同时又可以按时间、按关键词搜索,一举两得。 LOG4J 提花了一个JDBCAppender的远程数据库输出方案,使用也很简单,在配置文件里写好驱动名、URL及远程数据库的登陆账号、密码,再加一个布局&SQL语句全部搞定,真当是方便极了。在我本机上测试没有问题,但欢天喜地移植到服务器上问...

neil 302

Mybatis主配置文件模板和log4j.properties配置文件保存

二者都在项目的resource目录下 这里是连接Mysql数据库时写的 主配置文件: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/...

Mr.yang的博客 394

配置log4j写入数据库

首先按tomcat +sqlserver 数据连接池 中的方法配置数据连接池。 \WEB-INF\lib文件夹加入包msbase.jar;mssqlserver.jar;msutil.jar;log4j-1.2.8.jar 放在WEB_INF\class文件夹下的log.properties文件的内容如下 #输出到F:/home/example.log log4j.rootLogger=DE...

178
上一篇: 如何将你的网站开发成手机应用?
下一篇: c#使用Split方法分割字符串
weixin_33705053
博客等级 码龄11年 3607粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值