知识点一: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,至此功德圆满!