CN102331991A - 基于java语言通过异步方式存储日志的方法 - Google Patents

基于java语言通过异步方式存储日志的方法 Download PDF

Info

Publication number
CN102331991A
CN102331991A CN201110066095A CN201110066095A CN102331991A CN 102331991 A CN102331991 A CN 102331991A CN 201110066095 A CN201110066095 A CN 201110066095A CN 201110066095 A CN201110066095 A CN 201110066095A CN 102331991 A CN102331991 A CN 102331991A
Authority
CN
China
Prior art keywords
journal
file
daily record
log
java
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN201110066095A
Other languages
English (en)
Inventor
魏鼎
贾艳斌
樊学峰
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
BEIJING DIGITAL CHINA SI-TECH INFORMATION TECHNOLOGY Co Ltd
Original Assignee
BEIJING DIGITAL CHINA SI-TECH INFORMATION TECHNOLOGY Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by BEIJING DIGITAL CHINA SI-TECH INFORMATION TECHNOLOGY Co Ltd filed Critical BEIJING DIGITAL CHINA SI-TECH INFORMATION TECHNOLOGY Co Ltd
Priority to CN201110066095A priority Critical patent/CN102331991A/zh
Publication of CN102331991A publication Critical patent/CN102331991A/zh
Pending legal-status Critical Current

Links

Images

Abstract

本发明涉及一种基于JAVA语言通过异步方式存储日志的方法,它包括以下步骤:步骤1:配置包含日志存储API的文件,并将该文件复制到JAVA工程的Lib目录中,并设置到JAVA工程类路径classpath中;步骤2:配置调用日志存储API的文件参数,所述参数包括数据库连接参数、日志队列大小参数、日志批量入库条数参数和日志文件目录参数;步骤3:加载步骤2中配置的所述参数,并初试化数据库连接、日志队列以及日志文件目录;步骤4:调用日志存储API,进行异步存储日志;步骤5:通过判断日志队列是否已满,将日志记录至日志队列,或将日志记录至日志文件中并更新日志文件目录,然后将日志存入数据库。本发明的有益效果是:本发明基于异步方式、批量的进行日志存储,可以有效提高系统的整体性能;本发明使用简单,可以提高开发效率。

Description

基于JAVA语言通过异步方式存储日志的方法
技术领域
本发明涉及一种基于JAVA语言通过异步方式存储日志的方法。
背景技术
目前系统中的产生的日志都需要被记录下来,但是随着系统越来越大,记录的日志数量越来越多。大量同步记录日志的方式会产生很多I/O操作,这对系统的整体性能造成一定影响。
发明内容
本发明针对以上不足提供一种基于JAVA语言通过异步方式存储日志的方法,通过一种异步的,批量的方式来实现日志的存储,有效提高系统对于日志存储的性能。
本发明解决上述技术问题的技术方案如下:一种基于JAVA语言通过异步方式存储日志的方法,它包括以下步骤:
步骤1:配置包含日志存储API的文件,并将该文件复制到JAVA工程的Lib目录中,并设置到JAVA工程类路径classpath中;
步骤2:配置调用日志存储API的文件参数,所述参数包括数据库连接参数、日志队列大小参数、日志批量入库条数参数和日志文件目录参数;
步骤3:加载步骤2中配置的文件参数,并初试化数据库连接、日志队列以及日志文件目录;
步骤4:调用日志存储API,进行异步存储日志;
步骤5:通过判断日志队列是否已满,将日志记录至日志队列,或将日志存储日志文件中并更新日志文件目录,然后将日志存入数据库。
进一步的,步骤5为判断日志队列是否已满,未满则将日志直接记录至日志队列,日志队列扫描线程扫描日志队列,将日志存入数据库;
日志队列已满,则将日志记录到配置的目录中日志文件中,文件扫描线程重复扫描日志文件目录,并将日志存入数据库,日志存储后删掉日志文件。
进一步的,步骤5中的将日志记录至日志队列或日志文件与日志存储异步进行。
本发明的有益效果是:本发明基于异步方式、批量的进行日志存储,可以有效提高系统的整体性能;在以后开发新的系统时,可以直接集成本模块,无需再开发日志模块;本发明使用简单,直接调用记录日志的静态方法即可,可以提高开发效率。
附图说明
图1为本发明流程图。
具体实施方式
以下结合附图对本发明的原理和特征进行描述,所举实例只用于解释本发明,并非用于限定本发明的范围。
如图1所示,本发明包括以下步骤: 
步骤1:配置包含日志存储API的文件,即log.jar文件,并将该文件导入JAVA(Java,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称)工程中,即将本发明Jar文件:log.jar文件复制到JAVA工程的Lib(类库)目录中,并设置到JAVA工程类路径classpath(让Java执行环境找到指定的Java程序(也就是.class文件)的变量)中。
log.jar文件内核心处理程序片段如下:
1.    Scheduler.Java -把阻塞队列里边的日志入库的线程
package com.sitech.i4a.audit.log;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.concurrent.ArrayBlockingQueue;
import org.apache.log4j.Logger;
import com.sitech.i4a.audit.log.env.LogENV;
import com.sitech.i4a.audit.log.vo.LogVO;
/**
 * 项目名称:i4a-v2.0    
 * <p>Title: Scheduler</p>
 * <p>Description: 把阻塞队列里边的日志入库的线程</p>
 * <p>Copyright: Copyright (c) 2009</p>
 * <p>Company: SI-TECH </p>
 * authorsi-tech
 * 创建时间:Aug 15, 2009 8:14:42 PM 
 * version 1.0     
 * 修改人:si-tech
 * 修改时间:Aug 15, 2009 8:14:42 PM    
 * 修改备注:  
 *
 */
public class Scheduler extends AbstractScheduler { private static Logger logger = Logger.getLogger(Scheduler.class);
   //存放日志的队列。
   private final ArrayBlockingQueue<LogVO> queue;
   public Scheduler(ArrayBlockingQueue<LogVO> queue) {
      this.queue = queue;
   }
      /**
    * 执行存放。
    */
   public void run() {
      while(true) {
        //如果不够执行批量存储的数,则等待0.5秒后再做判断。
        int size =  queue.size();
        if(size >= LogENV.EXCUT_BATCH_SIZE) {
           try { excute();
           } catch (Exception e) {  e.printStackTrace();
              logger.error("日志批量入库出错:"+e.getMessage());
              continue;
           }
        }else {
           try {
              Thread.sleep(500);
           } catch (InterruptedException e) {
              e.printStackTrace();
              logger.error("日志批量入库线程异常:" +e.getCause());
              continue;
           }
        }
      }
   }
   protected void excute() throws Exception {
      Connection conn = getConnection();
      PreparedStatement preState = null;
      Statement statment = null;
      try {
        preState = conn.prepareStatement(sql);
        statment = conn.createStatement();
        //则执行批量入库。
        for(int i=0; i < LogENV.EXCUT_BATCH_SIZE; i++) {
           LogVO log = queue.take();
           excuteSQL(preState,statment,log);
        }
        preState.executeBatch();
        conn.commit();
      } catch (SQLException e) {
        logger.error(e.getMessage());
        throw new Exception(e);
      } catch (InterruptedException e) {
        logger.error(e.getMessage());
        throw new Exception(e);
      } finally {
        try {
           closeConn(conn,statment,preState);
        } catch (SQLException e) {
           logger.error(e.getMessage());
           e.printStackTrace();
        }
      }
   }
}
2.    LogWriter.Java -提供写日志的公用方法
package com.sitech.i4a.audit.log;
import java.util.concurrent.ArrayBlockingQueue;
import com.sitech.i4a.audit.log.env.LogENV;
import com.sitech.i4a.audit.log.vo.LogVO;
import com.sitech.i4a.audit.log.buffer.*;
/**
 * 
 * 项目名称:i4a-v2.0    
 * <p>Title: LogWriter</p>
 * <p>Description: 提供写日志的公用方法</p>
 * <p>Copyright: Copyright (c) 2009</p>
 * <p>Company: SI-TECH </p>
 * authorsi-tech  
 * 创建时间:Aug 17, 2009 8:50:54 AM 
 * version 1.0     
 * 修改人:si-tech
 * 修改时间:Aug 17, 2009 8:50:54 AM    
 * 修改备注:  
 *
 */
public class LogWriter {
      //存放日志的队列。
   private static ArrayBlockingQueue<LogVO> queue = 
      new ArrayBlockingQueue<LogVO>(LogENV.QUEUE_SIZE);
      //执行队列中的日志入库的线程。
   private static Scheduler scheduler = new Scheduler(queue);
      static{
      scheduler.start();
   }
      /**
    * 外部调用写日志的方法。
    */
   public static void writeLog(LogVO log) {
      if(!queue.offer(log)) {
        FileManager.deal(log);
      }
   }
}
步骤2:配置文件参数:
配置调用日志存储API的文件参数,即配置logenv.properties文件中的内容(即数据库连接参数、队列大小参数、批量入库条数参数等参数),然后将文件放入JAVA工程类路径(classpath)。配置文件参数如下:
#存放logVO阻塞队列的大小。
LOG_QUEUE_SIZE=10
#批量存储大小。
SQL_BATCH_EXCUTE_SIZE=4
#队列放满后,临时文件路径。
LOG_FILE_DIR=d:/working
#是否用容器配置的JNDI数据源,value = true Or false。
USE_WEB_APPS_DATASOURCE=false
#数据源名称,(如果使用容器的JNDI数据源,则配置该项)
DATA_SOURCE_NAME=jdbc/logDB
##----如果USE_WEB_APPS_DATASOURCE=false,请对数据源参数进行配置。
步骤3:加载配置的logenv.properties文件参数,并初试化数据库连接、日志队列以及日志文件目录;
#驱动名
DRIVER_CLASS=oracle.jdbc.driver.OracleDriver
#数据库连接URL
JDBC_URL=jdbc:oracle:thin:172.XX.XX.117:1523:basdb
#数据库用户
DB_USER=XXX
#该用户密码
USER_PASSWORD=XXX
#池最大连接数
MAX_POOL_SIZE=20
#池最小的连接数。
MIN_POOL_SIZE=2
#池初始化连接数。
INITIAL_POOL_SIZE=2
步骤4:调用日志存储API:
Java Class代码中需要引用以下JAVA类:
import com.sitech.i4a.audit.log.LogWriter;
import com.sitech.i4a.audit.log.vo.LogVO;
import com.sitech.i4a.audit.log.vo.LogVOFactory; 
Java Class代码进行日志存储调用过程如下:
// 初始化log日志对象 
LogVO log = LogVOFactory.createLogVO();
// 设置日志类型字段,字段数据可根据具体应用去定义
        log.setLogType();
// 设置操作类型字段,字段数据可根据具体应用去定义
        log.setOperateModule();
// 构造日志操作内容
  StringBuffer contentSb = new StringBuffer();
  contentSb.append("log content : ");
  contentSb.append("log content  log content.");
// 设置log日志对象操作内容属性
  log.setOperateContent(contentSb.toString());
  log.setOperateResult(); 
// 调用日志记录API
  LogWriter.writeLog(log);
// 调用操作完成
步骤5:通过判断日志队列是否已满,将日志记录至日志队列,或将日志记录至日志文件中并更新日志文件目录,然后将日志存入数据库。
本发明支持属性配置文件方式进行配置,配置项包括数据库连接参数、队列大小参数、批量入库条数参数、日志文件存储目录等,可以根据系统性能要求以及硬件资源配置进行灵活调整。JAVA程序加载logenv.properties配置文件参数,并完成数据库连接、日志队列、文件目录的初试化。
配置参数成功加载后,可以使用本发明提供的存储API(application programming interface,应用程序接口)进行日志存储,本发明提供简洁的存储API对JAVA开发者屏蔽具体的程序处理的流程,JAVA开发者可以通过简单的程序语言调用API,完成日志的异步存储。
调用存储API,判断此时日志队列是否已满,如果未满,直接记录至日志队列,扫描日志队列进程进行数据的批量入库操作存储日志记录;如果此时日志队列已满,则将日志记录到配置目录中的日志文件中,文件扫描线程重复扫描文件队列,并进行日志存储,日志存储后删掉日志文件。日志记录队列和文件与日志存储异步进行,提高日志存储的效率和性能。
本发明支持Oracle、MysqL、MsSql等各版本数据库。
本发明在将日志存储如数据库时采用了数据库连接技术,在将日志存储入日志队列或日志文件时采用了阻塞队列技术、JAVA线程技术以及文件读写等技术实现JAVA程序中异步方式的日志存储,解决同步日志存储性能瓶颈问题,提高日志存储效率,从而提高系统整体性能。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

Claims (3)

1.一种基于JAVA语言通过异步方式存储日志的方法,其特征在于,它包括以下步骤:
步骤1:配置包含日志存储API的文件,并将该文件复制到JAVA工程的Lib目录中,并设置到JAVA工程类路径classpath中;
步骤2:配置调用日志存储API的文件参数,所述参数包括数据库连接参数、日志队列大小参数、日志批量入库条数参数和日志文件目录参数;
步骤3:加载步骤2中配置的所述参数,实现数据库连接、日志队列以及日志文件目录的初试化;
步骤4:调用日志存储API,进行异步存储日志;
步骤5:通过判断日志队列是否已满,将日志记录至日志队列,或将日志记录至日志文件中并更新日志文件目录,然后将日志存入数据库。
2.根据权利要求1所述的基于JAVA语言通过异步方式存储日志的方法,其特征在于,所述步骤5为判断日志队列是否已满,未满则将日志直接记录至日志队列,日志队列扫描线程扫描日志队列,将日志存入数据库;
日志队列已满,则将日志记录到配置的目录中日志文件中,文件扫描线程重复扫描日志文件目录,并将日志存入数据库,日志存储后删掉日志文件。
3.根据权利要求1所述的基于JAVA语言通过异步方式存储日志的方法,其特征在于:所述步骤5中的将日志记录至日志队列或日志文件与日志存储异步进行。
CN201110066095A 2011-03-18 2011-03-18 基于java语言通过异步方式存储日志的方法 Pending CN102331991A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201110066095A CN102331991A (zh) 2011-03-18 2011-03-18 基于java语言通过异步方式存储日志的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201110066095A CN102331991A (zh) 2011-03-18 2011-03-18 基于java语言通过异步方式存储日志的方法

Publications (1)

Publication Number Publication Date
CN102331991A true CN102331991A (zh) 2012-01-25

Family

ID=45483770

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201110066095A Pending CN102331991A (zh) 2011-03-18 2011-03-18 基于java语言通过异步方式存储日志的方法

Country Status (1)

Country Link
CN (1) CN102331991A (zh)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103577310A (zh) * 2012-07-20 2014-02-12 腾讯科技(深圳)有限公司 记录软件调试日志的方法以及装置
CN103812703A (zh) * 2014-02-20 2014-05-21 浪潮集团有限公司 一种基于云计算的异步保存日志方法
CN105930395A (zh) * 2016-04-15 2016-09-07 北京思特奇信息技术股份有限公司 一种基于ibatis的批量录入方法及系统
CN107015910A (zh) * 2017-04-06 2017-08-04 上海云轴信息科技有限公司 保证异步程序健壮性的方法及设备
CN108984378A (zh) * 2018-07-02 2018-12-11 中国农业银行股份有限公司 一种日志数据异步处理方法及装置

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20050278706A1 (en) * 2004-06-10 2005-12-15 International Business Machines Corporation System, method, and computer program product for logging diagnostic information

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20050278706A1 (en) * 2004-06-10 2005-12-15 International Business Machines Corporation System, method, and computer program product for logging diagnostic information

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
肖文等: "基于J2EE的日志管理中间件的设计和实现", 《计算机应用研究》 *
闫宏印等: "J2EE平台下社保综合系统的设计与实现", 《计算机工程》 *

Cited By (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103577310A (zh) * 2012-07-20 2014-02-12 腾讯科技(深圳)有限公司 记录软件调试日志的方法以及装置
CN103812703A (zh) * 2014-02-20 2014-05-21 浪潮集团有限公司 一种基于云计算的异步保存日志方法
CN105930395A (zh) * 2016-04-15 2016-09-07 北京思特奇信息技术股份有限公司 一种基于ibatis的批量录入方法及系统
CN107015910A (zh) * 2017-04-06 2017-08-04 上海云轴信息科技有限公司 保证异步程序健壮性的方法及设备
CN108984378A (zh) * 2018-07-02 2018-12-11 中国农业银行股份有限公司 一种日志数据异步处理方法及装置
CN108984378B (zh) * 2018-07-02 2021-09-07 中国农业银行股份有限公司 一种日志数据异步处理方法及装置

Similar Documents

Publication Publication Date Title
US11782892B2 (en) Method and system for migrating content between enterprise content management systems
US20090049422A1 (en) Method and system for modeling and developing a software application
CN102549559B (zh) 托管的计算机环境中的虚拟对象间接化
US20050203760A1 (en) Project time and expense
US9152796B2 (en) Dynamic analysis interpreter modification for application dataflow
US10078674B2 (en) Integrated workflow and database transactions
US20070156486A1 (en) Multiple concurrent workflow persistence schemes
US20060230044A1 (en) Records management federation
US8583651B2 (en) Deferring classification of a declared record
KR20080087802A (ko) 작업 흐름에 대한 객체 모델
CN102810057A (zh) 一种记录日志的方法
JP2009532756A (ja) 軽量スレッドの並行処理制御のための宣言型モデル
US20100274813A1 (en) Extensible framework for data import and export
US8793706B2 (en) Metadata-based eventing supporting operations on data
US20200065313A1 (en) Extensible content object metadata
CN102331991A (zh) 基于java语言通过异步方式存储日志的方法
EP2388697B1 (en) System and method for managing conflicts between business functions configurations
US8463755B2 (en) System and method for providing collaborative master data processes
JP2019207687A (ja) データモデルのオブジェクトを使用したプロジェクト成果物の生成
CN101789944B (zh) 多功能电能表通信协议栈的开发系统
JP2024505236A (ja) データ処理システム用のデータセットマルチプレクサ
US9721230B2 (en) Developer mode for workflow systems steering patch deployment
CN102841785A (zh) 一种文件句柄关闭操作的方法及装置
US20170039385A1 (en) Record-level security access in workflows
Betzing Design and Development of an Event-driven In-memory Business Process Engine

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C53 Correction of patent of invention or patent application
CB02 Change of applicant information

Address after: 100085 Haidian District, Zhongguancun, South Street, No. 6,, building information, floor, No. 16

Applicant after: SI-TECH Information Technology Ltd.

Address before: 100085, Beijing, Haidian District on the nine Street 9 digital science and Technology Plaza, two floor

Applicant before: Beijing Digital China SI-TECH Information Technology Co., Ltd.

COR Change of bibliographic data

Free format text: CORRECT: APPLICANT; FROM: BEIJING DIGITAL CHINA SI-TECH INFORMATION TECHNOLOGY LTD. TO: BEIJING SI-TECH INFORMATION TECHNOLOGY LTD.

C12 Rejection of a patent application after its publication
RJ01 Rejection of invention patent application after publication

Application publication date: 20120125