SpringAOP+注解+反射实现日志功能

知识点一:Java反射

http://www.cnblogs.com/hanhuibing/articles/4754310.html

知识点二:Java注解

http://www.cnblogs.com/hanhuibing/articles/4754385.html

知识点三:Java注解解析器

http://www.cnblogs.com/hanhuibing/articles/4754468.html

知识点四:log4g

http://www.cnblogs.com/hanhuibing/articles/4757846.html

开工

第一步:表结构

第二步:自定义日志注解类

package com.system.annotate;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {
    /**
     * 日志信息
     * 
     * @return
     * @author 韩慧兵
     * @version 2015-8-21 下午12:51:11
     * @since JDK 1.6
     */
    String message();
}

 第三步:自定义springmvc拦截器

package com.system.interceptor;

import java.lang.reflect.Method;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.bky.controller.T_BizlogController;
import com.bky.controller.T_ErrlogController;
import com.bky.util.ApplicationContextUtil;
import com.bky.util.UtilFunction;
import com.bky.vo.T_Bizlog;
import com.bky.vo.T_Errlog;
import com.bky.vo.T_User;
import com.system.annotate.Log;
/**
 * 拦截器描述:日志拦截器
 *                  拦截业务日志,并持久化至业务表中;拦截错误日志,并持久化至错误表和log4g文件中 
 * @author   韩慧兵
 * @version  2015-8-25 下午3:52:31
 * @since    JDK 1.6
 */
public class LogInterceptor extends HandlerInterceptorAdapter {
    
    /**
     * 自定义log4g
     */
    private static Logger logger =  Logger.getLogger("操作日志"); 
    
    /**
     * 毫秒级日期格式定义
     */
    java.text.SimpleDateFormat sdf=new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
    
    /**
     * 请求发起时间
     */
    Date methodbegin;
    
    /**
     * 请求结束时间
     */
    Date methodend;
    
    /**
     * 对方法级请求进行拦截 
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     * @author   韩慧兵
     * @version  2015-8-25 下午3:55:12
     * @since    JDK 1.6
     */
    @Override
    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // 只拦截方法级请求
        if (handler instanceof HandlerMethod) {
            // 获取session
            HttpSession session = request.getSession();
            T_User userinfo = (T_User) session.getAttribute("userinfo");

            // 转换handmethod
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            Method method = handlerMethod.getMethod();

            // 获取注解
            final Log log = method.getAnnotation(Log.class);

            // 日志持久化
            if (log != null && null != userinfo) {
                // 操作人
                String username = userinfo.getUserName();
                // 操作时间
                String currenttime = UtilFunction.getNewDate();
                // 操作角色
                String rolenames = userinfo.getRoleNames();
                // 操作部门
                String orgnames=userinfo.getDepartNames();
                // 操作单位
                String companys=userinfo.getT_company().getCompanyName();
                // 操作动作
                String methods=log.message();
                // 操作结束时间
                methodend=new Date();
                // 操作所需时间
                long between = (methodend.getTime() - methodbegin.getTime());// 得到两者的毫秒数
                // 操作状态
                int handelState=0;
                // 是否发生异常
                if(ex!=null){
                    //记录异常
                    handelState=1;
                    
                    //持久化日志文件
                    add_log4g_err(ex, log, username, currenttime, rolenames);
                    
                    // 持久化入库
                    add_errlog(ex, username, currenttime, rolenames, orgnames,
                            companys, methods, between);
                }        
                
                //持久化日志文件
                add_log4g_info(log, username, currenttime, rolenames);
                
                // 持久化入库
                add_bizlog(username, currenttime, rolenames, orgnames,
                        companys, methods, between,handelState);
            }
        }

    }

    /**
     * 持久化log4g Info 级日志  
     * @param ex
     * @param log
     * @param username
     * @param currenttime
     * @param rolenames
     * @author   韩慧兵
     * @version  2015-8-25 下午4:02:26
     * @since    JDK 1.6
     */
    private void add_log4g_info( final Log log, String username,
            String currenttime, String rolenames) {
        String logStr;
        String handleState="成功";
        // 操作失败日志
        logStr = "操作员:" + username + " 角色:" + rolenames + "  操作时间:"
                    + currenttime + "  进行:" + log.message()
                    + "操作! 操作状态:"+handleState;
        //定义err级别信息
        logger.info(logStr);
    }

    /**
     * 持久化log4g Err 级日志 
     * @param ex
     * @param log
     * @param username
     * @param currenttime
     * @param rolenames
     * @author   韩慧兵
     * @version  2015-8-25 下午3:50:53
     * @since    JDK 1.6
     */
    private void add_log4g_err(Exception ex, final Log log, String username,
            String currenttime, String rolenames) {
        String logStr;
        String handleState="失败";
        // 操作失败日志
        logStr = "操作员:" + username + " 角色:" + rolenames + "  操作时间:"
                    + currenttime + "  进行:" + log.message()
                    + "操作! 操作状态:"+handleState+"   失败原因:" + ex.getMessage();
        //定义err级别信息
        logger.error(logStr);
    }

    /**
     * 持久化至业务数据表 
     * @param username
     * @param currenttime
     * @param rolenames
     * @param orgnames
     * @param companys
     * @param methods
     * @param between
     * @author   韩慧兵
     * @version  2015-8-25 下午3:51:06
     * @since    JDK 1.6
     */
    private void add_bizlog(String username, String currenttime,
            String rolenames, String orgnames, String companys, String methods,
            long between,int handelState) {
        T_BizlogController bizlogController=ApplicationContextUtil.getContext().getBean(T_BizlogController.class);            
        T_Bizlog bizlog=new T_Bizlog();
        bizlog.setBizlogid(UtilFunction.getUuid());
        bizlog.setBizusername(username);
        bizlog.setBizrole(rolenames);
        bizlog.setBizorg(orgnames);
        bizlog.setHandleState(handelState);
        bizlog.setBizdatetime(currenttime);
        bizlog.setBizmethod(methods);
        bizlog.setBizcompany(companys);
        bizlog.setBizusetime(String.valueOf(between));
        bizlogController.add_bizlog(bizlog);
    }

    /**
     * 持久化至错误记录表中 
     * @param ex
     * @param username
     * @param currenttime
     * @param rolenames
     * @param orgnames
     * @param companys
     * @param methods
     * @param between
     * @author   韩慧兵
     * @version  2015-8-25 下午3:51:23
     * @since    JDK 1.6
     */
    private void add_errlog(Exception ex, String username, String currenttime,
            String rolenames, String orgnames, String companys, String methods,
            long between) {
        T_ErrlogController errlogController=ApplicationContextUtil.getContext().getBean(T_ErrlogController.class);
        T_Errlog errlog=new T_Errlog();
        errlog.setErrlogid(UtilFunction.getUuid());
        errlog.setErrcompany(companys);
        errlog.setErrdatetime(currenttime);
        errlog.setErrdes(ex.getMessage());
        errlog.setErrmethod(methods);
        errlog.setErrorg(orgnames);
        errlog.setErrrole(rolenames);
        errlog.setErrusername(username);
        errlog.setErrusetime(String.valueOf(between));
        errlogController.add_errlog(errlog);
    }

    @Override
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {

    }

    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        //记录方法开始时间
        methodbegin=new Date();
        return true;
    }
}

 第四步:sping-mvc.xml中配置自定义拦截器

    <mvc:interceptors> 
        <mvc:interceptor>  
           <mvc:mapping path="/*.do" />
           <bean class="com.system.interceptor.LogInterceptor"></bean>  
        </mvc:interceptor>  
    </mvc:interceptors> 

第五步:日志注解使用

package com.bky.controller;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.bky.service.T_RoleService;
import com.bky.util.easyuivo.ComboBox;
import com.bky.util.easyuivo.Datagrid;
import com.bky.vo.T_Role;
import com.system.annotate.Log;

@Controller
public class T_RoleController extends BaseController {
    // 定义service类
    private T_RoleService t_roleService;

    public T_RoleService getT_roleService() {
        return t_roleService;
    }

    @Autowired
    public void setT_roleService(T_RoleService t_roleService) {
        this.t_roleService = t_roleService;
    }
    
    /**
     * 跳转至角色列表 
     * @param request
     * @param response
     * @return
     * @author   韩慧兵
     * @version  2015-7-23 下午8:52:56
     * @since    JDK 1.6
     */
    @RequestMapping("toT_RoleList")
        public String toT_RoleList(HttpServletRequest request,
                HttpServletResponse response) {
        return "/jnqudb/t_role/t_role_list";
    }
    /**
     * 角色列表分页
     * 
     * @param request
     * @param response
     * @return
     * @author 韩慧兵
     * @version 2015-6-25 上午12:02:22
     * @since JDK 1.6
     */
    @Log(message="角色列表查询")
    @RequestMapping("getT_RoleList")
    public String getT_RoleList(HttpServletRequest request,
            HttpServletResponse response) {
        // 获取请求
        Map<?, ?> paramMap = getPageParam(request);

        // 分页查询
        List<T_Role> pagelist = t_roleService.getEasyUiAllList(paramMap);
        
        // 获取总记录数
        int total = t_roleService.getCountByRoleName(paramMap).size();

        // 获取datagrid对象
        Datagrid<?> grid = getDatagrid(pagelist, total);

        // 转换datagrid为json输出至前台
        super.writeJson(response, grid);

        return "/jnqudb/t_role/t_role_list";
    }

    /**
     * 跳转至增加页
     * 
     * @param request
     * @return
     * @author 韩慧兵
     * @version 2015-7-21 下午7:03:45
     * @since JDK 1.6
     */
    @Log(message="跳转至角色增加页")
    @RequestMapping("toaddT_Role")
    public String toaddT_Role(HttpServletRequest request) {
        return "/jnqudb/t_role/t_role_add";
    }

    /**
     * 增加角色
     * 
     * @param request
     * @param sysrole
     * @return
     * @author 韩慧兵
     * @version 2015-7-21 下午7:03:25
     * @since JDK 1.6
     */
    @Log(message="增加角色")
    @RequestMapping("add_role")
    public void add_role(HttpServletRequest request, T_Role sysrole) {
        String str = t_roleService.addInfo(sysrole);
        request.setAttribute("InfoMessage", str);
    }

    /**
     * 跳转至修改页面
     * 
     * @param request
     * @param t_role
     * @return
     * @author 韩慧兵
     * @version 2015-7-16 下午2:55:15
     * @since JDK 1.6
     */
    @Log(message="跳转至角色修改页")
    @RequestMapping("to_roleupdate")
    public String to_roleupdate(HttpServletRequest request, T_Role t_role) {
        // 根据角色id查询角色 详细信息
        t_role = t_roleService.findById(t_role.getRoleId());
        request.setAttribute("t_role", t_role);
        return "/jnqudb/t_role/t_role_update";
    }

    /**
     * 修改角色信息
     * 
     * @param request
     * @param depart
     * @return
     * @author 韩慧兵
     * @version 2015-7-16 下午2:55:23
     * @since JDK 1.6
     */
    @Log(message="修改角色")
    @RequestMapping("update_role")
    public void update_role(HttpServletRequest request, T_Role trole) {
        String str = t_roleService.update(trole);
        request.setAttribute("InfoMessage", str);
    }

    /**
     * 删除角色
     * 
     * @param request
     * @param trole
     * @author 韩慧兵
     * @version 2015-7-21 下午7:02:51
     * @throws Exception 
     * @since JDK 1.6
     */
    @Log(message="删除角色")
    @RequestMapping("deletRoleInfo")
    public void deletRoleInfo(HttpServletRequest request, T_Role trole,HttpServletResponse response) throws Exception {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
    /********************根据角色id查询是否有用户在使用  begin************************/
        int num = t_roleService.selectuserByroleId(trole.getRoleId());
        if("0".equals(num) || 0 == num){
            t_roleService.delete(trole.getRoleId());
            out.write("0");
        }else{
            out.write("1");
        }
    /********************根据角色id查询是否有用户在使用  end**************************/
    }

    /**
     * 启用禁用角色
     * 
     * @author 韩慧兵
     * @version 2015-7-17 下午7:14:03
     * @since JDK 1.6
     */
    @Log(message="启用禁用角色")
    @RequestMapping("enable_t_rolefun")
    public void enable_t_rolefun(HttpServletRequest request, T_Role trole) {
        int str = t_roleService.enable_t_rolefun(trole);
        request.setAttribute("InfoMessage", str);
    }
    
    /**
     * 获取所有角色下拉内容 
     * @param request
     * @param response
     * @param companyId
     * @throws Exception
     * @author   申晓玲
     * @version  2015年7月22日 下午4:03:24
     * @since    JDK 1.7
     */
    @RequestMapping("roleAll")
    public void roleAll(HttpServletRequest request,HttpServletResponse response) throws Exception {
        //查询所有的角色启用的下拉内容
        List<T_Role> rolelist = t_roleService.selectAllrole();
        //定义ComboBox对象
        List<ComboBox> comList=new ArrayList<ComboBox>();
        for(int i=0;i<rolelist.size();i++){
            ComboBox com = new ComboBox();
            com.setId(rolelist.get(i).getRoleId());
            com.setText(rolelist.get(i).getRoleName());
            comList.add(com);
        }
        super.writeJson(response,comList);
    }
}

第六步:配置log4g

log4j.rootLogger=DEBUG, Console, E ,F

#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p [%c] - %m%n-

log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=ERROR
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG 

log4j.appender.E=org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File=../temp/err_log.txt
log4j.appender.E.layout=org.apache.log4j.PatternLayout
log4j.appender.E.Append = true
log4j.appender.E.ImmediateFlush = true
log4j.appender.E.Threshold = E
log4j.appender.E.DatePattern = '.'yyyy-MM-dd'.txt'
log4j.appender.E.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c]%m%n

log4j.appender.F=org.apache.log4j.DailyRollingFileAppender
log4j.appender.F.File=../temp/biz_log.txt
log4j.appender.F.layout=org.apache.log4j.PatternLayout
log4j.appender.F.Append = true
log4j.appender.F.ImmediateFlush = true
log4j.appender.F.Threshold = INFO
log4j.appender.F.DatePattern = '.'yyyy-MM-dd'.txt'
log4j.appender.F.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c]%m%n

 第七步:测试

控制台日志

日志文件

界面展示

ok,至此功德圆满!

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值