java 操作日誌的創建

log4j記錄系統中的日誌信息,主要是異常信息!或者是用戶自定義的信息,便於用戶或者程序員,發現錯誤信息及時調整、修改bug.
對於用戶登陸系統後,它所進行的操作我們有時後也需要進行記錄。這個就要使用操作日誌了,自己動手寫吧!我這個利用Spring的Aop實現的!我是在bizImpl對業務時行處理,主要功能也是集中在這一塊。所以切的時候也是切在這一塊。Action層中只負責調用bizImpl層的方法。切面類也是一個普通的java類,它裏面有個logging當它捕獲它bizImpl中的方法時,就會進入到這個方法中。我們可以得到攔截方法的名字以及方法中的參數信息,其後可以將操作信息加入到數據庫中進行保存。
/**
* Copyright(C): iusesoft
* author: author
* comments: 切面類,對攔截的方法進行判斷
* version: 1.00
* date: Jul 31, 2010
*/
package com.iusersoft.util;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.aspectj.lang.JoinPoint;

import com.iusersoft.system.biz.impl.OperateLogBizImp;
import com.iusersoft.system.entity.OperateLog;

public class OperatorAspect{
/*private OperatorLogAction operatorLog;

public OperatorLogAction getOperatorLog() {
return operatorLog;
}

public void setOperatorLog(OperatorLogAction operatorLog) {
this.operatorLog = operatorLog;
}*/

private OperateLogBizImp operateLogBiz;

public OperateLogBizImp getOperateLogBiz() {
return operateLogBiz;
}

public void setOperateLogBiz(OperateLogBizImp operateLogBiz) {
this.operateLogBiz = operateLogBiz;
}

/**
* 定義advice,即切面類中方法具體實現, 這裏主要是用於記錄日誌,只做簡單處理。
*
* @param joinPoint,可以取得被攔截方法的一些信息
*/
public void logging(JoinPoint joinPoint) {
[color=red]//得到被攔截方法參數,並打印[/color]
/*Object[] args = joinPoint.getArgs();
for (int i = 0; i < args.length; i++) {
System.out.println("method arg 攔截到的參數名:" + i + " -- " + args[i]);
}*/
[color=red]//攔截到方法的名稱[/color]
String actionName = joinPoint.getSignature().getName();
//操作類型名稱
String actionType = ArgObject.OperatorActionName(actionName);
//操作的表名
String operateName=ArgObject.argObjecgt(actionName)+"表進行的"+actionType;

if("無匹配表進行的沒有匹配的方法名".equals(operateName)){
operateName=actionName;
}
//考慮到效率對於查詢沒有進行保存
if(!("查詢".equals(actionType)))
{
OperateLog log = new OperateLog();
try{
log.setOperate(actionType);
log.setOperateCode(24);
log.setOperateLogId(963);
log.setOperateName("hh");
log.setOperateTime(new Date());
log.setOperateObject(operateName);
operateLogBiz.addLog(log);
}catch(Exception ex){
ex.printStackTrace();
}
}else{
//可以方便地修改日期格式
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM hh:mm:ss");
String targetDate = dateFormat.format( new Date() );
System.out.println(targetDate+ operateName);
}
}
}

先看看applicationContext.xml的配置信息:

<!-- 配置aspect切面類 -->
<bean id="operatorAspect" class="com.iusersoft.util.OperatorAspect" >
<!--操作日誌中注入的operateLogBiz-->
<property name="operateLogBiz" ref="operatorLogBiz2"></property>
</bean>
<!-- 配置AOP -->
<aop:config>
<!-- 配置aspect切面類 -->
<aop:aspect ref="operatorAspect">
[color=red]<!-- 配置pointcut,即切入點,對哪些類的哪些方法起到AOP的作用 -->[/color]
<aop:pointcut id="userServiceMethods"
expression="execution(* com.iusersoft.*.biz.impl.*Impl.*(..))" />
[color=red] <!-- 配置advice,即Aspect類中的logging()方法,這裏採用在業務方法執行前進行攔截 -->[/color]
<aop:before method="logging" pointcut-ref="userServiceMethods" />
</aop:aspect>
</aop:config>

日誌操作的Action
/**
* Copyright(C): iusesoft
* author: user1
* comments: 日誌操作
* version: 1.00
* date: Aug 2, 2010
*/
package com.iusersoft.system.action;

import com.iusersoft.base.BaseAction;
import com.iusersoft.system.biz.IOperateLogBiz;

public class OperatorLogAction extends BaseAction {

private IOperateLogBiz operateLogBiz;

public IOperateLogBiz getOperateLogBiz() {
return operateLogBiz;
}

public void setOperateLogBiz(IOperateLogBiz operateLogBiz) {
this.operateLogBiz = operateLogBiz;
}

private int start;
public int getStart() {
return start;
}

public void setStart(int start) {
this.start = start;
}

private int limit;
public int getLimit() {
return limit;
}

public void setLimit(int limit) {
this.limit = limit;
}


/*********
* 查詢所有日誌信息
* @return
*/
public String selectAlloperatorLog(){
try{
operateLogBiz.selectAllOperatorLog(start, limit, response);
}catch(Exception ex){
ex.printStackTrace();
}
return null;
}
/********
* 刪除日誌信息
* @return
*/
public String deleteAllOperatorLog(){
try{
operateLogBiz.deleteAllOperatorLog();
}catch(Exception ex){
ex.printStackTrace();
}
return null;
}

//查詢功能用到的變量
private String condition ;

public String getCondition() {
return condition;
}

public void setCondition(String condition) {
this.condition = condition;
}
/*********
* 查詢日誌功能
* @condition 查詢條件
* @start 顯示記錄的開始位置
* @limit 每頁顯示的記錄條數
* @response 客戶端寫數據的對象
*/
public String queryOperatorLog(){
try{
operateLogBiz.queryOperatorLog(condition, start, limit, response);
}catch(Exception ex){
ex.printStackTrace();
}
return null;
}




}

日誌操作的bizImpl層
/**
* Copyright(C): iusesoft
* author: author
* comments: 日誌操作的bizImple
* version: 1.00
* date: Aug 2, 2010
*/
package com.iusersoft.system.biz.impl;

import java.text.ParseException;
import java.util.List;

import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

import com.iusersoft.system.biz.IOperateLogBiz;
import com.iusersoft.system.dao.IOperateLogDao;
import com.iusersoft.system.entity.OperateLog;
import com.iusersoft.util.OperatorDate;
import com.iusersoft.util.PageUtil;

public class OperateLogBizImp implements IOperateLogBiz {


//日誌記錄器
public static Logger logger = Logger.getLogger(OperateLogBizImp.class);
private IOperateLogDao operateLogDao;

public IOperateLogDao getOperateLogDao() {
return operateLogDao;
}
public void setOperateLogDao(IOperateLogDao operateLogDao) {
this.operateLogDao = operateLogDao;
}
/*********
* 實現對日誌的保存功能
* @log 要保存的日誌對象
*/
public void addLog(OperateLog log) {
try{
operateLogDao.add(log);
}catch(Exception ex){
ex.printStackTrace();
logger.error("出錯了!",ex);
}
}
/******
* 返回數據庫中操作日誌的個數
*/
public int queryOperatorLogCount(){
String hql="from OperateLog";
return operateLogDao.queryByHQL(hql).size();
}
/*******
* 查詢操作日誌信息
* @start 顯示記錄開始位置
* @limit 每頁顯示的記錄條數
* @response 客戶端寫數據的對象
*/
public void selectAllOperatorLog(int start,int limit,HttpServletResponse response) {
String hql ="from OperateLog";
List<OperateLog> listOperateLog;
try{
//先刪除,在查詢
this.deleteDateOperatorLog();
listOperateLog = operateLogDao.queryByHQLForPagination(hql, start, limit);
int totalProperty = this.queryOperatorLogCount();
PageUtil.pageSet(totalProperty,listOperateLog, response);
}catch(Exception ex){
ex.printStackTrace();
logger.error("出錯了!",ex);
}
}
/*******
* 刪除日誌數據中的記錄
*/
public void deleteAllOperatorLog() {
String hql="delete from i_xt_operatelog where 1=1";
try{
//System.out.println("");
operateLogDao.deleteAll(hql);
//System.out.println(hql);
}catch(Exception ex){
ex.printStackTrace();
logger.error("出錯了!",ex);
}
}

/*******
* 刪除本月以外的日誌信息
* @throws ParseException
*/
public void deleteDateOperatorLog() throws ParseException {
//先得到日
String today = OperatorDate.operatorLogDay();
String sql="";
if("01".equals(today)){
//得到當前月份
String targetDate =OperatorDate.operatorLogDate();
sql = "delete from i_xt_operatelog where operateTime < "+"'"+targetDate+"'";
try{
operateLogDao.deleteAll(sql);
}catch (Exception ex) {
ex.printStackTrace();
logger.error("出錯了!",ex);
}
}
// System.out.println("sql:"+sql);
}


/**********
* @condition 查詢條件
* @start 顯示記錄的開始位置
* @limit 每頁顯示的記錄條數
* @response 客戶端寫數據的對象
*/
public void queryOperatorLog(String condition, int start, int limit,
HttpServletResponse response) {
String hql="from OperateLog log";
boolean flag = false;
if(null==condition || condition.equals("輸入查詢條件")){
hql="from OperateLog log";
}else{
flag = true;
hql +=" where log.operateName='"+condition+"'";
}
//System.out.println(hql);
List<OperateLog> listOperateLog ;
int totalProperty=0;
try{
listOperateLog = operateLogDao.queryByHQLForPagination(hql, start, limit);
if(!flag){
totalProperty = this.queryOperatorLogCount();
}else{
totalProperty =listOperateLog.size();
}
PageUtil.pageSet(totalProperty, listOperateLog, response);
}catch(Exception ex){
ex.printStackTrace();
logger.error("出錯了!",ex);
}
}

}


剩下的就是daoImpl和dao以及OperatorLog這個實體信息!dao操作都和以往是相同,增刪改!自己看着實現下!
它對bizImpl中所有的方法進行攔截!然後進入切面類的loggin()的方法中,在這個方法中可以獲取參數的信息,方法的名字!然後進行相應的保存寫到數據庫中就行了!這個功能沒有對查詢進行保存,查詢操作太多了!對於一些關鍵的方法,主要實現記錄。
最後還有一個問題:比如bizImpl中某個方法調用其它的工具類中的方法,就沒有辦法捕獲了!比如:下面的例子findById()和delete就沒辦法捕獲,想捕獲它們就應該加在dao層上了!

//刪除客戶信息
public void deleteCustomer(int customerId){
try{
Customer customer = (Customer) customerDao.findById(cid);
customerDao.delete(customer);
}catch(Exception ex){
ex.printStackTrace();
logger.error("出錯了!",ex);
}

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章