操作日志记录

1.存在的意义

所日志记录,就是记录所有的操作,使领导对这个系统的流转了如指掌,同时要是系统出现了问题,也可以清楚找到问题的所在。

2. 界面展示

3. 主要代码分析(提供三种方法)

  3.1 方法一 使用aop实现

源码介绍:

01.首先在保证你的环境无误的情况下(我用的是ssh)

02.BussAnnotation.java  (自定义注解)

package cn.bdqn.annotation;

/**
 * 自定义注解(用于记录日志)
 */
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD })
public @interface BussAnnotation {
    // 模块名
    String moduleName();
    // 操作内容
    String option();
}

03.LogBeforeAdvice.java (前置增强)---主要记录的方法

package cn.bdqn.aop;
/**
 * aop前置增强结合自定义注解实现记录日志
 */
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.struts2.ServletActionContext;
import org.springframework.aop.MethodBeforeAdvice;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.bdqn.annotation.BussAnnotation;
import cn.bdqn.base.BaseService;
import cn.bdqn.entity.PSUser;
import cn.bdqn.entity.PsLogs;
import cn.bdqn.service.IPsLogsService;

public class LogBeforeAdvice implements MethodBeforeAdvice{

     public void before(Method method, Object[] args, Object target)
                throws Throwable {
            // 拿到我们的service对象
            ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
            IPsLogsService bean = (IPsLogsService)context.getBean("pslsi");
            //注解,拿到类型的元数据
            BussAnnotation ol = method.getAnnotation(BussAnnotation.class);
            if (ol!=null) {
                 System.out.println(ol.moduleName()+"\t"+ol.option());
                 //判断是否
                 PSUser user=(PSUser)ServletActionContext.getRequest().getSession().getAttribute("loginuserinfo");
                 PsLogs logs=new PsLogs();
                 if(user==null){//在登录的时候记录登录信息
                     String userCode = ServletActionContext.getRequest().getParameter("userCode");//登录界面的值
                     System.out.println(userCode);
                     //赋值并保存
                     SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                     Date date = sdf.parse(sdf.format(new Date()));
                     logs.setOperateInfo(ol.option());
                     logs.setOperateDatetime(date);
                     logs.setUserCode(userCode);
                     ((BaseService<PsLogs>) bean).save(logs);
                 }else{//登录后,直接记录我们自定义注解中指定的信息
                     //赋值并保存
                     SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                     Date date = sdf.parse(sdf.format(new Date()));
                     logs.setOperateInfo(ol.option());
                     logs.setOperateDatetime(date);
                     logs.setUserCode(user.getUserCode());
                     ((BaseService<PsLogs>) bean).save(logs);

                 }
            }

        }    

}

04.XXXAction.java (Action类中使用自定义注解实现记录)

        /*
     * 用于登录
     */
    @BussAnnotation(moduleName="用户登录",option="登录")
    public String login() {

          //关键代码

       return SUCCESS;
    }

05.applicationContext.xml (配置aop)

<!-- aop结合自定义注解实现日志记录 -->
    <bean name="logBefore" class="cn.bdqn.aop.LogBeforeAdvice"></bean>
    <aop:config proxy-target-class="true">
        <aop:pointcut expression="execution(* *..action.*.*(..))"
            id="pointcut" />
        <aop:advisor advice-ref="logBefore" pointcut-ref="pointcut" />
    </aop:config>

  3.2 方法二  使用过滤器实现

源码介绍:

01.FunctionFilter.java (过滤器)---主要记录的方法

package cn.bdqn.filter;
/**
 * 用于记录操作日志的过滤器类(方法二)
 */
import java.io.IOException;
import java.util.Date;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
 */
import cn.bdqn.entity.PSFunction;
import cn.bdqn.entity.PSRole;
import cn.bdqn.entity.PSUser;
import cn.bdqn.entity.PsLogs;
import cn.bdqn.service.IPsLogsService;

public class FunctionFilter implements Filter {
    public void destroy() {

    }
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        System.out.println("用于记录操作日志的过滤器类");
        HttpServletRequest req=(HttpServletRequest)request;
        String url=req.getRequestURI();
        System.out.println(url);
        //过滤掉所有静态资源,不做处理
        if (url.endsWith(".js")) {
            chain.doFilter(request, response);
        }
        if (url.endsWith(".css")) {
            chain.doFilter(request, response);
        }
        if (url.endsWith(".html")) {
            chain.doFilter(request, response);
        }
        if (url.endsWith(".txt")) {
            chain.doFilter(request, response);
        }
        if (url.endsWith(".gif")) {
            chain.doFilter(request, response);
        }
        if (url.endsWith(".jpg") || url.endsWith(".jpeg")) {
            chain.doFilter(request, response);
        }
        if (url.endsWith(".png")) {
            chain.doFilter(request, response);
        }
        int pos=url.indexOf("?");
        if (pos>-1) {
            url=url.substring(0,pos);
        }
        int actionindex=url.indexOf(".action");
        if(actionindex>-1){
            url=url.substring(0,actionindex);
        }
        int of = url.indexOf("/", 2);
        url=url.substring(of+1);

        System.out.println("url地址:"+url);
        //判断是否登录
        PSUser user=(PSUser)req.getSession().getAttribute("loginuserinfo");
        if(url.endsWith("login")||url.equals("")){
                chain.doFilter(request, response);
        }else if(user!=null){
            for (PSRole role : user.getRole()) {
                for (PSFunction function : role.getPsFunctions()) {
                    if(function.getFuncUrl().equals(url)){
                        PsLogs log=new PsLogs();
                        log.setOperateDatetime(new Date());
                        log.setOperateInfo(function.getFunctionName());
                        log.setUserCode(user.getUserCode());
                        //获取spring的上下文容器
                        ApplicationContext contex=new ClassPathXmlApplicationContext("applicationContext.xml");
                        //获取spring容器中定义的IRoleService对象实例用于查询角色信息
                        IPsLogsService logsService = contex.getBean(IPsLogsService.class,"pslsi");
                        logsService.save(log);
                        chain.doFilter(request, response);
                    }
                }
        }
        }else{
            HttpServletResponse resp=(HttpServletResponse) response;
            resp.setCharacterEncoding("utf-8");
            resp.getWriter().write("<script type=‘text/javascript‘>alert(‘您没有该权限‘)</script>");
        }
    }

    public void init(FilterConfig arg0) throws ServletException {

    }

}

02.web.xml

       <!-- 配置记录日志的过滤器(方法二) -->
     <filter>
        <filter-name>functionfilter</filter-name>
        <filter-class>cn.filter.FunctionFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>functionfilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping> 

3.3 方法三  使用拦截器实现

源码介绍:

01.BussAnnotation.java  (自定义注解)

package cn.bdqn.annotation;

/**
 * 自定义注解(用于记录日志)
 */
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD })
public @interface BussAnnotation {
    // 模块名
    String moduleName();
    // 操作内容
    String option();
}

02.OperateLogIntercepter.java (自定义拦截器)---主要记录的方法

package cn.bdqn.interceptor;
/**
 * 记录日志的拦截器(方法三)
 */

import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.ServletActionContext;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.bdqn.annotation.BussAnnotation;
import cn.bdqn.base.BaseService;
import cn.bdqn.entity.PSUser;
import cn.bdqn.entity.PsLogs;
import cn.bdqn.service.IPsLogsService;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class OperateLogIntercepter extends AbstractInterceptor{

    private static final long serialVersionUID = 1L;

    private static final Log log=LogFactory.getLog(OperateLogIntercepter.class);

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        /*Object bean = SpringContextHelper.getBean("psLogsService");*/

        System.out.println("日志拦截器已经开始启动");
        //获得service实例
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
        IPsLogsService bean = (IPsLogsService)context.getBean("pslsi");

        Class<? extends Object> actionClass=invocation.getAction().getClass();
        String methodName=invocation.getProxy().getMethod();
        //获取当前方法
        Method currentMethod=actionClass.getMethod(methodName);
        boolean flag = currentMethod.isAnnotationPresent(BussAnnotation.class);
        if(flag){
            BussAnnotation ol=currentMethod.getAnnotation(BussAnnotation.class);
            PsLogs logs=new PsLogs();
            PSUser user=(PSUser)ServletActionContext.getRequest().getSession().getAttribute("loginuserinfo");
            if(user==null){//在登录的时候记录登录信息
                String userCode = ServletActionContext.getRequest().getParameter("userCode");
                System.out.println(userCode);
                SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                Date date = sdf.parse(sdf.format(new Date()));
                logs.setOperateInfo(ol.option());
                logs.setOperateDatetime(date);
                logs.setUserCode(userCode);
                ((BaseService<PsLogs>) bean).save(logs);
            }else{//登录后,直接记录我们自定义注解中指定的信息
                SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                Date date = sdf.parse(sdf.format(new Date()));
                logs.setOperateInfo(ol.option());
                logs.setOperateDatetime(date);
                logs.setUserCode(user.getUserCode());
                ((BaseService<PsLogs>) bean).save(logs);

            }

        }
        return invocation.invoke();
    }

    public static Log getLog() {
        return log;
    }
}

03.XXXAction.java (Action类中使用自定义注解实现记录)

        /*
     * 用于登录
     */
    @BussAnnotation(moduleName="用户登录",option="登录")
    public String login() throws Exception {

            //主要代码

          return SUCCESS;

    }

04.struts.xml (使用拦截器)

               <!-- 拦截器 -->
        <interceptors>
            <!-- 声明记录日志拦截器 -->
            <interceptor name="logs" class="cn.interceptor.OperateLogIntercepter"></interceptor>
            <!-- 配置一个拦截器栈 -->
            <interceptor-stack name="myStack">
                <!-- <interceptor-ref name="logs"></interceptor-ref> -->
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>
        </interceptors>
        <!--默认使用这个拦截器栈 -->
        <default-interceptor-ref name="myStack"></default-interceptor-ref>

时间: 2024-10-11 00:55:37

操作日志记录的相关文章

springmvc+log4j操作日志记录,详细配置

没有接触过的,先了解一下:log4j教程 部分内容来:log4j教程 感谢! 需要导入包: log包:log4j-12.17.jar 第一步:web.xml配置 <!-- log4j配置,文件路径,因为是跟随项目启动 --> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>/WEB-INF/log4j.xml</param-value>

简易的用户操作日志记录

记录系统内用户的操作日志. 1.日志类 public class SysLog { /** * 主键 */ private String id; /** * 操作开始时间 */ private Date createTime; /** * 操作结束时间 */ private Date endTime; /** * 执行耗时 */ private long excuteTime; /** * 接口地址 */ private String url; /** * 请求参数 */ private Str

syslog-ng+loganalyzer(非常详细配置文件)部署收集操作日志

一.syslog-ng 说明 二.syslog-ng 下载安装 三.syslog-ng 配置文件详细说明 四.配置syslog-ng收集操作日志 五.使用loganalyzer展示收集日志 1.syslog-ng说明 syslog-ng应用程序是一个灵活和高度可伸缩的系统日志应用程序创建集中的和可信的日志解决方案的理想选择.syslog-ng的主要特征概括如下: (1)可靠的日志传输:syslog-ng应用程序使您能够发送你的主机到远程服务器的日志消息使用最新的协议标准.不同服务器的日志可以收集

Java日志记录的5条规则

日志记录是在软件开发过程中常常需要考虑的关键因素. 当产品运行出错时,日志文件通常是我们进行错误分析的首要选择. 而且,在很多情况下,它们是我们手上唯一可以用来查明发生状况和问题根本原因的信息. 可见,正确记录需要的信息是极其重要的. 以下5条日志规则,让我们可以检查和改进在代码中操作日志记录的方式. 同时也请注意,我们既不会讨论怎么配置一个日志引擎,也不会相互比较. 规则1.日志是面向读者的 日志消息不仅要对书写(日志)代码的人有意义,也应该对日志文件的读者有意义. 这似乎是一条很明显但却经常

OSharp3.0框架解说系列(6.2):操作日志与数据日志

前言 在<[开源]OSharp框架解说系列(6.1):日志系统设计>中,我们已经设计并实现了一个可扩展的日志系统,只要定义好输出端的Adapter,就可以以任意形式输出日志信息. 在日志开发中,有些日志记录需求是常规需要的,比如操作日志,数据变更日志,系统异常日志等,我们希望把这些常规需求都集成到OSharp框架当中.有了内置的支持,在做开发的时候,只需要很简单的配置,就可以实现相关需求. 关于三类日志,这里先简要描述一下: 操作日志:粗略描述系统用户(如管理员.业务人员.会员等)对系统的业务

切面编程(操作日志)

自定义注解 import java.lang.annotation.*; /** * @author wzm */ //注解会在class中存在,运行时可通过反射获取 @Retention(RetentionPolicy.RUNTIME) //目标是方法 @Target({ElementType.METHOD, ElementType.PARAMETER}) //表示是否将注解信息添加在java文档中 @Documented public @interface Log { //这个用户所做的是什

Tomcat会话超时时怎样记录操作日志,满足安全审计要求

众所周知.在实际的Web应用程序中,会话管理一般都採用Web容器会话管理功能. 使用Tomcat做Webserver也是如此,并且从安全的角度考虑,尽量避免去更改和干预Web容器的会话管理功能. Tomcat会话管理功能肯定比我们自己做出来要全面和可靠,况且Tomcat是主流开源社区维护的.有专门的团队来开发和维护.一旦爆出安全漏洞,也能非常快被修复. 在实际开发中,为了满足安全审计的要求.Web应用程序一旦有会话注销.就应该记录操作日志.注销一般分为操作者主动注销.应用程序检測到异常攻击主动注

按时按登录IP记录Linux所有用户操作日志的方法(附脚本)

PS:Linux用户操作记录一般通过命令history来查看历史记录,但是如果因为某人误操作了删除了重要的数据,这种情况下history命令就不会有什么作用了.以下方法可以实现通过记录登陆IP地址和所有用户登录所操作的日志记录! 在/etc/profile配置文件的末尾加入以下脚本代码就可以实现,下面脚本是我网上找来的,原作者不知.但原脚本的时间变量有错误,不能记录时间,本人测试发现并检查修正: PS1="`whoami`@`hostname`:"'[$PWD]' history US

用户操作拦截并作日志记录--自定义注解+AOP拦截

作为运营除了处理系统生产问题,还要处理大量的用户上报事件,这部分工作占用了大量的人力.所有考虑把一部分事件查询处理做成一个自助平台,让用户自行核查处理.于是就有了用户自助系统.考虑到如何计量这个工具平台具体的实现价值,需要做用户操作统计才能给出可信服的数据. 以上就是本文的背景.自助系统的架构就是传统的springmvc+spinrg+mybatis+oracle.想到日志记录首先想到的就是AOP拦截处理.网上相关的技术贴很多.简单的小项目遇到的问题一般度娘都能给解决了~\(≧▽≦)/~ 自定义