`
johnson.lee
  • 浏览: 52822 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Log4j记录日志到数据库

阅读更多
[list]
  • 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);
    	}
    }
    

    [/list]
    0
    1
    分享到:
    评论
    2 楼 johnson.lee 2009-12-05  
    sunrie 写道
    能不能做到异步的记录到数据库呢?

    1楼所指的异步是指多线程并发的记录日志到数据库中吧?异步记录应该是没问题的,像对HTTP请求做处理时,就有并发的情况,用log4j记录日志是没问题的。
    1 楼 sunrie 2009-12-01  
    能不能做到异步的记录到数据库呢?

    相关推荐

      ApexSQllog2014,SQL数据库日志查询软件

      ApexSQL Log 2014是一款专业的SQL数据库日志查询工具,专为数据库管理员和开发人员设计,用于深入分析和审计SQL Server数据库中的事务历史记录。它提供了强大的功能,帮助用户追踪数据库中的更改,包括插入、更新和...

      log4net配置,日志纪录log4j的.NET版

      Log4net是一个开源的日志组件,支持多种日志输出方式,如控制台、文件、数据库等。它具有灵活的配置机制,可以根据不同环境和需求轻松调整日志级别、格式和输出目标。此外,log4net与.NET的集成使得它能在各种.NET...

      中国奥运纪录-鸿波制作-数据库

      总的来说,《中国奥运纪录-鸿波制作-数据库》是一个集成了中国奥运历史的宝贵资源,其背后的技术涉及到数据库管理系统、数据存储、日志记录、SQL查询、数据规范化和安全性等多个IT领域的专业知识。这样的数据库对于...

      对用户操作进行纪录,并写入日志

      2. **日志记录方法**: `log(String message)` 和 `log(Exception ex)` 是用于记录日志信息的核心方法。前者用于记录普通信息,后者专门用于记录异常信息。这两个方法都实现了同步处理,确保在多线程环境中日志的写入...

      c#实现邮件群发以及log日志记录(可执行文件+源码)

      log4net是Apache组织提供的一款开源的日志记录工具,支持多种日志输出方式,如文本文件、数据库、Windows事件日志等。在C#项目中,首先需要通过NuGet包管理器安装log4net库,然后在程序的配置文件(如app.config或...

      数据库竞赛

      而事务日志文件的逻辑文件名 Yggl_log,磁盘文件名为 ProductSales_log.ldf,文件初始容量为5MB,最大容量为 10MB,文件递增量为 1MB。 十三、数据表的创建 使用 SQL 语句定义员工表、工作情况表和公司表,定义每...

      深入了解 SQL Server 交易紀錄

      标题 "深入了解 SQL Server 交易纪录" 指的是对 SQL Server 数据库管理系统中交易日志(Transaction Log)的深入理解。在 SQL Server 中,交易日志是数据库完整性、恢复和性能优化的关键组成部分。它记录了数据库中...

      MSsql每天自动备份数据库并每天自动清除log的脚本

      “下一步”选择更新数据优化信息、“下一步”检查数据库完整性、“下一步”指定数据库备份计划、“下一步”指定备份存放位置、“下一步”指定事务日志备份计划、“下一步”指定报表,“下一步”指定历史纪录维护,...

      用户管理与纪录管理.NET

      在.NET中,可以使用各种日志库,如Log4Net、NLog或Serilog。这些库提供了丰富的日志级别(如Debug、Info、Warn、Error、Fatal)和日志目标(如文件、控制台、数据库、云服务),便于根据需要调整日志的详细程度和...

      DATASTAGE增量抽取

      4. 触发器INC_TR:使用触发器INC_TR监听源表的变化,并将变化的数据写入增量日志表中。 5. “test增量获取”stage:配置“test增量获取”stage,输入数据源名、账号密码、载入表定义等信息。 6. “增量数据加载”...

      Mysql效率优化定位较低sql的两种方式

      通过慢查询日志定位那些执行效率较低的 SQL 语句,用 –log-slow-queries[=file_name] 选项启动时, mysqld 会 写一个包含所有执行时间超过 long_query_time 秒的 SQL 语句的日志文件,通过查看这个日志文件定位效率...

      cOffice通用OA系统源代码

      对操作的错误日志会自动记录到log文件中 默认管理员帐号/密码:51aspx/51aspx Db_51aspx下面为数据库文件,附加即可 该版本由Asp.net1.1转换而来,菜单采用的是iewebcontrols 主要修正的问题: 1、由Asp.net1.1...

      ZendFramework中文文档

      4.2.2. 标记纪录 4.2.3. 缓存清理 4.3. Zend_Cache前端 4.3.1. Zend_Cache_Core 4.3.1.1. 简介 4.3.1.2. 可用选项 4.3.1.3. 例子 4.3.2. Zend_Cache_Frontend_Output 4.3.2.1. 简介 4.3.2.2. 可用的选项 ...

      java-batchfiles

      9. **日志记录**:为了追踪和调试批处理过程,日志记录(如使用Log4j或Java内置的`java.util.logging.Logger`)是必不可少的。 10. **持久化存储**:批处理中可能涉及数据库交互,如使用JDBC或JPA来存取数据。 综...

      飞思COffice通用OA系统源代码

      对操作的错误日志会自动记录到log文件中 默认管理员帐号/密码:51aspx/51aspx App_Data下面为数据库文件,附加即可 该版本由Asp.net1.1转换而来,菜单采用的是iewebcontrols 主要修正的问题: 1、由Asp.net1.1升级到...

      sysinternals 工具集合 (20090226版)

       Diskmon是一硬盘数据存取实时监控软件 ,能够将 Windows NT/2000/XP 操作系统的硬盘数据存取时间滴水不漏地纪录下来,您还可以将纪录文件储存成 LOG 文字文件。  DiskView  DiskView 该软件集成于微软的Windows...

      JEECMS V7最新最全数据字典

      46. **jc_log**: CMS日志表 - 描述:记录系统运行的日志信息。 - 关键字段:日志ID、操作类型、操作时间等。 47. **jc_message**: 站内信 - 描述:实现用户之间的内部通信。 - 关键字段:消息ID、发送者ID、...

    Global site tag (gtag.js) - Google Analytics