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) {
//得到被拦截方法参数,并打印
/*Object[] args = joinPoint.getArgs();
for (int i = 0; i < args.length; i++) {
System.out.println("method arg 拦截到的参数名:" + i + " -- " + args[i]);
}*/
//拦截到方法的名称
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">
<!-- 配置pointcut,即切入点,对哪些类的哪些方法起到AOP的作用 -->
<aop:pointcut id="userServiceMethods"
expression="execution(* com.iusersoft.*.biz.impl.*Impl.*(..))" />
<!-- 配置advice,即Aspect类中的logging()方法,这里采用在业务方法执行前进行拦截 -->
<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);
}
}
分享到:
相关推荐
首先,Java中的操作记录通常通过日志系统来实现,如Log4j、SLF4J、Logback等。这些日志框架提供了丰富的接口和配置选项,可以让开发者方便地记录不同级别的日志信息(如DEBUG、INFO、WARN、ERROR等)。例如,使用Log...
通常会涵盖如何创建日志实例、设置日志级别、记录不同类型的日志信息等操作。 在实际应用中,开发者可以通过以下步骤使用这个组件: 1. **导入依赖**:将日志组件的JAR包或者Maven/Gradle依赖添加到项目中。 2. *...
在本文中,我们将深入探讨如何使用Log4j进行日志操作。 首先,理解Log4j的基本组件是至关重要的。Log4j包含三个主要部分:Logger(日志器)、Appender(输出目的地)和Layout(格式化器)。 1. **Logger**: 这是...
打开一个文本编辑器,创建一个名为“HelloWorld.java”的文件,并输入以下内容: ```java public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } } ...
本资源主要涉及两个核心知识点:Java项目的Linux启动脚本和日志分割工具cronolog。 首先,让我们来深入理解Java项目的Linux启动脚本。在SpringBoot这样的微服务架构中,通常需要编写自定义的Shell脚本来实现服务的...
3. **多目的地IP支持**:在Java程序中,如果需要向多个Syslog服务器发送日志,可以创建多个`SyslogIF`实例或者配置多个`SyslogAppender`,分别设置不同的IP地址。然后根据日志记录的需求,选择合适的发送实例。 在...
10. **日志审计**:对于关键操作,可以记录详细的操作日志,以便进行安全审计。 压缩包文件`bappsdk_j2ee`可能是该日志控件的J2EE版本,可能包含了相关的jar库、配置示例、API文档等资源,用于在Java EE环境下集成...
### Java日志合并知识点解析 #### 一、背景与需求分析 在软件开发过程中,日志文件对于系统维护和故障排查具有重要的作用。通常情况下,一个应用可能会产生多个日志文件,这些文件可能分布在不同的目录下。为了方便...
本篇将围绕“使用Java正则表达式分析处理日志”这一主题,探讨如何利用Java的正则表达式功能来提取、过滤和操作日志数据。 首先,我们需要理解正则表达式的基本概念。正则表达式(Regular Expression)是一种模式...
用例图展示了系统的主要参与者(如用户)与系统提供的功能之间的关系,包括创建日志、编辑日志、查看日志、搜索日志、绩效考核等关键操作。 2.2.2 时序图 时序图描述了用户与系统交互的动态过程,显示了请求处理的...
如果你选择使用`java.util.logging`,可以创建一个`Handler`来实现syslog日志发送: ```java import java.net.DatagramSocket; import java.net.InetAddress; import java.util.logging.*; public class ...
在Linux环境下,编写脚本来编译Java代码以及定时删除日志是常见的系统管理任务,这有助于保持系统的高效运行和良好的资源管理。以下是关于这个主题的详细讲解。 首先,让我们了解如何在Linux下编译Java程序。Java源...
7. **网络编程**:Java的Socket编程允许创建客户端和服务器应用程序,进行TCP/IP通信。理解Socket和ServerSocket类,以及套接字通信的基本流程,有助于开发网络应用。 8. **数据库连接**:Java Database ...
在创建Java版QQ空间日志系统时,我们可能首先会定义一个`Log`模型类,包含日志的标题、内容、作者、创建时间等属性,并提供相应的增删改查方法。接着,我们需要创建对应的DAO(Data Access Object)层来处理数据库...
Java语言编写的日历日志程序是一个典型的课程设计项目,主要目标是让学生掌握Java编程基础以及实际应用。这个程序提供了日历浏览和日志管理的功能,对于初学者来说,这样的项目能够帮助他们深入理解面向对象编程、...
Java日志操作是Java开发中不可或缺的一部分,主要用于记录程序运行过程中的信息,以便于监控、追踪代码行为以及调试。Apache Commons Logging是一个开放源代码的项目,它提供了一个通用的日志接口,允许开发者选择...
我们可以创建一个名为`LoggerUtil`的工具类,其中包含静态方法来处理各种日志操作。以下是一个基本的`LoggerUtil`类的实现: ```java import java.util.logging.Level; import java.util.logging.Logger; public ...
在Java编程语言中,获取文件的创建时间是一个常见的任务,特别是在处理文件系统操作时。Java提供了丰富的类库来处理文件信息,其中包括获取文件的各种元数据,如创建时间、修改时间等。以下是一些关于如何在Java中...
而操作日志则专注于记录用户操作或系统响应的详细情况,对数据变更和操作过程进行追踪。 传统的日志记录方法往往是在系统的关键位置直接加入日志输出语句,如使用System.out.println()或者日志框架提供的API。但...
在Java编程语言中,"动态创建"通常指的是在运行时创建对象或类的能力。这个概念在许多高级编程技术中都非常重要,例如反射、动态代理和元编程。在本教程中,我们将深入探讨Java中的动态创建及其相关知识点。 1. **...