/**配置类
**/@Component
@Order(value=1)
public class MyApplicationRunner implements ApplicationRunner{
/*private static final Logger logger = LoggerFactory.getLogger(MyApplicationRunner.class);@Autowiredprivate MemoryService memoryService; @Overridepublic void run(ApplicationArguments args) throws Exception {logger.info("==服务启动后,初始化数据操作==");memoryService.getResources();}*/}

添加日志的配置类

package com.run.runlpwebdemo.config;import java.util.Arrays;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;import javax.servlet.http.HttpServletRequest;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.run.runlpwebdemo.bean.Log;
import com.run.runlpwebdemo.bean.Resource;
import com.run.runlpwebdemo.service.LogService;
import com.run.runlpwebdemo.service.MemoryService;@Aspect
@Component
public class WebLogAspect {private Logger logger = LoggerFactory.getLogger(this.getClass());@Autowiredprivate MemoryService memoryService;@Autowiredprivate LogService logService;@Pointcut("execution(public * com.run.runlpwebdemo.controller..*.*(..))")public void webLog() {}@Before("webLog()")public void doBefore(JoinPoint joinPoint) {// 接收到请求,记录请求内容logger.info("WebLogAspect.doBefore()");ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();// 记录下请求内容logger.info("URL : " + request.getRequestURL().toString());logger.info("HTTP_METHOD : " + request.getMethod());logger.info("IP : " + request.getRemoteAddr());logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());logger.info("ARGS : " + Arrays.toString(joinPoint.getArgs()));saveLog(request);}private void saveLog(HttpServletRequest request) {Log log = new Log();String currentUrl = getCurrentURL(request);String parameterJson = getCurrentParameters(request);        Resource resource = memoryService.getResource(currentUrl);//需要记录日志的资源则记录日志if(null!=resource&&resource.getIsLog()==1) {String description = "";description +=resource.getResourceName();if (StringUtils.hasText(parameterJson)) {description += (StringUtils.hasText(description) ? "," : "") + "参数:" + parameterJson;}log.setDescription(description);log.setUserIp(request.getRemoteAddr());String moduleName = memoryService.getModuleName(currentUrl);if (StringUtils.hasText(moduleName)) {log.setModuleName(moduleName);}logService.insert(log);}}/*** 获取当前url* * @return*/public String getCurrentURL(HttpServletRequest request) {String currentURL = request.getRequestURI();String contextPath = request.getContextPath();if (currentURL.startsWith(contextPath)) {currentURL = currentURL.replaceFirst(contextPath, "");}return currentURL;}/*** 获取当前请求参数的Json* * @return*/public String getCurrentParameters(HttpServletRequest request) {String parameterJson = "";ObjectMapper mapper = new ObjectMapper();Map<String, Object> map = new HashMap<>();Enumeration<?> parameterEnum = request.getParameterNames();while (parameterEnum.hasMoreElements()) {String paramName = (String) parameterEnum.nextElement();String[] values = request.getParameterValues(paramName);for (int i = 0; i < values.length; i++) {map.put(paramName, values);}}if (map.size() > 0) {try {parameterJson = mapper.writeValueAsString(map);} catch (JsonProcessingException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return parameterJson;}}

Service层代码编写

package com.run.runlpwebdemo.service;import java.util.List;import com.run.runlpwebdemo.bean.Resource;/*** <p>Title:内存持久化服务接口</p> * <p>Description:  </p>* <p>Copyright: Copyright (c) 2003 - 2014 </p>* <p>Company: Run Technology Co.Ltd. Beijing </p>* <p>bulid: 2014-4-30 下午03:41:43 </p>* @author 王松 E-mail:wangsong@bjrun.com* @version 1.0 */
public interface MemoryService {/*** 获取访问资源列表*/public List<Resource> getResources();/*** 根据Id获取访问资源* @param resourceId* @return*/public Resource getResource(int resourceId);/*** 刷新访问资源* @param resourceId*/public void flushResource(int resourceId);/*** 内存删除访问资源* @param resourceId*/public void removeResource(int resourceId);/*** 根据URL获取访问资源* @param url*/public Resource getResource(String url);/*** 判断url是否是公共资源* @param permissionUrl*/public boolean isCommon(String permissionUrl);/*** 判断url是否记录日志* @param roleId* @param permissionUrl*/public boolean isLog(String permissionUrl);/*** 获取模块名称* @param permissionUrl*/public String getModuleName(String permissionUrl);}

serviceImp代码层的编写

package com.run.runlpwebdemo.service.impl;import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import com.run.runlpwebdemo.bean.Resource;
import com.run.runlpwebdemo.constant.Memory;
import com.run.runlpwebdemo.constant.MemoryKey;
import com.run.runlpwebdemo.dao.ResourceDao;
import com.run.runlpwebdemo.query.ResourceQuery;
import com.run.runlpwebdemo.service.MemoryService;
import com.run.runlpwebdemo.utils.StringUtil;/*** <p>* Title:内存持久化服务方法* </p>* <p>* Description:* </p>* <p>* Copyright: Copyright (c) 2003 - 2014* </p>* <p>* Company: Run Technology Co.Ltd. Beijing* </p>* <p>* bulid: 2014-4-30 下午03:12:41* </p>* * @author 王松 E-mail:wangsong@bjrun.com* @version 1.0*/
@Service("memoryService")
public class MemoryServiceImpl implements MemoryService{@Autowiredprivate ResourceDao resourceDao;/*** 获取访问资源列表*/public List<Resource> getResources() {String key = MemoryKey.RESOURCE_ALLID_KEY;String resourceIds = "";List<Resource> resources = new ArrayList<Resource>();String resourceKey = "";if (Memory.containsKey(key)) {resourceIds = (String) Memory.get(key);if (StringUtils.hasText(resourceIds)) {Resource resource = null;int[] rIds = StringUtil.getIds(resourceIds);for (int resourceId : rIds) {resourceKey = MemoryKey.RESOURCE_ID_PREFIX + resourceId;resource = (Resource) Memory.get(resourceKey);if (resource != null) {resources.add(resource);}}}} else {// 资源没有内存持久化ResourceQuery query = new ResourceQuery();query.setPage(false);resources = resourceDao.getResources(query);// 读取全部资源if (resources != null && resources.size() > 0) {for (Resource resource : resources) {resourceIds += (StringUtils.hasText(resourceIds) ? "," : "")+ resource.getResourceId();resourceKey = MemoryKey.RESOURCE_ID_PREFIX + resource.getResourceId();Memory.put(resourceKey, resource);resourceKey = MemoryKey.RESOURCE_URL_PREFIX + resource.getUrl();Memory.put(resourceKey, resource);}}}return resources;}/*** 根据Id获取访问资源* * @param resourceId* @return*/public Resource getResource(int resourceId) {String key = MemoryKey.RESOURCE_ID_PREFIX + resourceId;Resource resource = null;if (Memory.containsKey(key)) {resource = (Resource) Memory.get(key);} else {resource = resourceDao.getResource(resourceId);Memory.put(key, resource);if (resource != null) {key = MemoryKey.RESOURCE_URL_PREFIX + resource.getUrl();Memory.put(key, resource);}}return resource;}/*** 刷新访问资源* * @param resourceId*/public void flushResource(int resourceId) {removeResource(resourceId);getResource(resourceId);}/*** 内存删除访问资源* * @param resourceId*/public void removeResource(int resourceId) {String key = MemoryKey.RESOURCE_ID_PREFIX + resourceId;Resource resource = getResource(resourceId);if (Memory.containsKey(key)) {Memory.remove(key);}if (resource != null) {key = MemoryKey.RESOURCE_URL_PREFIX + resource.getUrl();if (Memory.containsKey(key)) {Memory.remove(key);}}}/*** 根据URL获取访问资源* * @param url*/public Resource getResource(String url) {String key = MemoryKey.RESOURCE_URL_PREFIX + url;Resource resource = null;if (Memory.containsKey(key)) {resource = (Resource) Memory.get(key);} else {ResourceQuery query = new ResourceQuery();query.setPage(false);query.setUrl(url);List<Resource> resources = resourceDao.getResources(query);// 读取资源if (resources != null && resources.size() > 0) {resource = resources.get(0);Memory.put(key, resource);key = MemoryKey.RESOURCE_ID_PREFIX + resource.getResourceId();Memory.put(key, resource);}}return resource;}/*** 判断url是否是公共资源* * @param permissionUrl*/public boolean isCommon(String permissionUrl) {boolean rtn = false;Resource resource = getResource(permissionUrl);if (resource != null) {if (resource.getIsCommon() == 1) {rtn = true;}}return rtn;}/*** 判断url是否记录日志* * @param permissionUrl*/public boolean isLog(String permissionUrl) {boolean rtn = false;Resource resource = getResource(permissionUrl);if (resource != null) {if (resource.getIsLog() == 1) {rtn = true;}}return rtn;}/*** 获取模块名称* * @param permissionUrl*/public String getModuleName(String permissionUrl) {String moduleName = "";Resource resource = getResource(permissionUrl);if (resource != null) {if (resource.getIsNav() == 1) {moduleName = resource.getResourceName();} else {resource = getResource(resource.getParentId());if (resource != null) {if (resource.getIsNav() == 1) {moduleName = resource.getResourceName();}}}}return moduleName;}
}

Mapper映射文件以及Dao编写

package com.run.runlpwebdemo.dao;import java.util.List;import org.springframework.stereotype.Repository;import com.run.runlpwebdemo.bean.Resource;
import com.run.runlpwebdemo.query.ResourceQuery;/*** <p>Title:访问资源DAO方法</p> * <p>Description:  </p>* <p>Copyright: Copyright (c) 2018 - 2028 </p>* <p>Company: Run Technology Co.Ltd. Beijing </p>* <p>bulid: 2018-7-20 下午03:12:41 </p>* @author * @version 1.0 */
//@Repository
public interface ResourceDao {/*** 主键查询访问资源* @param resourceId* @return*/public Resource getResource(int resourceId);/*** 复杂条件查询访问资源* @param query 包含查询和排序条件* @return*/public List<Resource> getResources(ResourceQuery query);}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.run.runlpwebdemo.dao.ResourceDao"><!-- 访问资源表--><sql id="RESOURCE_TABLE">SYS_RESOURCE</sql><!-- 资源查询条件 --><sql id="sqlFilter"><trim prefix="where" prefixOverrides="and |or">  <if test="updateResourceId != null and updateResourceId != 0">  <![CDATA[R.RESOURCE_ID<>#{updateResourceId}]]>   </if><if test="keyword != null and keyword != ''">  AND R.RESOURCE_NAME LIKE '%'||#{keyword}||'%'</if><if test="parentIds != null">  R.PARENT_ID in <foreach item="item" index="index" collection="parentIds" open="(" separator="," close=")">#{item}</foreach></if><if test="resourceName != null and resourceName != ''">  AND R.RESOURCE_NAME=''||#{resourceName}||''</if><if test="parentId != null and parentId >= 0">  AND R.PARENT_ID=#{parentId}  </if> <if test="url != null and url != ''">  AND R.URL=''||#{url}||''</if><if test="isCommon != null and isCommon >= 0">  AND R.IS_COMMON=#{isCommon}  </if><if test="isNav != null and isNav >= 0">  AND R.IS_NAV=#{isNav}  </if><if test="isButton != null and isButton >= 0">  AND R.IS_BUTTON=#{isButton}  </if><if test="navNum != null and navNum > 0">  AND R.NAV_NUM=#{navNum}  </if><if test="isRoleResource != null and isRoleResource == 1">  <![CDATA[AND R.RESOURCE_ID > 1]]>   </if></trim></sql><!-- 主键查询 --><select id="getResource" parameterType="int" resultType="com.run.runlpwebdemo.bean.Resource">SELECT R.RESOURCE_ID, R.RESOURCE_NAME, R.PARENT_ID, R.URL, R.IS_COMMON, R.IS_NAV, R.IS_BUTTON, R.IS_LOG, R.NAV_NUMFROM <include refid="RESOURCE_TABLE"/> RWHERE R.RESOURCE_ID=#{resourceId}</select><!-- 条件查询--><select id="getResources" parameterType="com.run.runlpwebdemo.query.ResourceQuery" resultType="com.run.runlpwebdemo.bean.Resource"><if test="isPage">SELECT * FROM (SELECT TABLE_A.*,ROWNUM AS MY_ROWNUM FROM (</if>SELECT R.RESOURCE_ID, R.RESOURCE_NAME, R.PARENT_ID, R.URL, R.IS_COMMON, R.IS_NAV, R.IS_BUTTON, R.IS_LOG, R.NAV_NUMFROM <include refid="RESOURCE_TABLE"/> R<include refid="sqlFilter"/><if test="orderField != null and orderField != ''">ORDER BY  ${orderField}<if test="orderField != null and orderField != ''">${orderType}</if></if> <if test="isPage"><![CDATA[ ) TABLE_A WHERE ROWNUM <= #{maxnum} ) WHERE MY_ROWNUM > #{minnum} ]]></if></select></mapper>

Springboot 日志管理模块编写记录相关推荐

  1. SpringCloud使用注解+AOP+MQ来实现日志管理模块

    程序员的成长之路 互联网/程序员/技术/资料共享 关注 阅读本文大概需要 5 分钟. 来自:blog.csdn.net/weixin_38802061/article/details/10545804 ...

  2. 基于Spring Cloud实现日志管理模块

    简介: 无论在什么系统中,日志管理模块都属于十分重要的部分,接下来会通过注解+AOP+MQ的方式实现一个简易的日志管理系统 思路: **注解:**标记需要记录日志的方法 **AOP:**通过AOP增强 ...

  3. vue后台管理系统之日志管理模块

    前端的后台的日志管理模块功能的实现 (使用的是elementUI框架) 这是日志管理模块实现的效果图 <!-- 搜索 --><div class="log-header&q ...

  4. springboot日志管理+集成log4j

    java中Logger.getLogger(Test.class) log4的使用方法:  log4是具有日志记录功能,主要通过一个配置文件来对程序进行监测 有两种配置方式:一种程序配置,一种文件配置 ...

  5. Springboot [日志管理LogBack]

    Spring Boot的日志详解 日志框架的介绍 Logback是由log4j创始人设计的另一个开源日志组件,官方网站: http://logback.qos.ch.它当前分为下面下个模块: logb ...

  6. 05-wtm日志管理模块

    生成的mysql数据库编码: 日志表结构: actionlogs:  GUID主键, 模块名称, 动作名称, 账号, 动作URL, 操作时间, 运行时间, IP地址, 备注, 日志类型: 页面: 日志 ...

  7. 八.利用springAMQP实现异步消息队列的日志管理

    经过前段时间的学习和铺垫,已经对spring amqp有了大概的了解.俗话说学以致用,今天就利用springAMQP来完成一个日志管理模块.大概的需求是这样的:系统中有很多地方需要记录操作日志,比如登 ...

  8. 浪潮服务器系统下收集日志,浪潮:打卡了解Venus 详解这款OpenStack日志管理项目...

    (全球TMT2021年5月24日讯)Venus是什么?初见还要追溯到去年11月召开的浪潮云海创新论坛2020.会上不仅分享了浪潮云海对于前沿科技的创新洞见以及扎实可靠的落地实践,更重要的是TA,一个开 ...

  9. ExtAspNet应用技巧(十九) - 日志管理

    界面截图 点击左侧"日志管理",在右侧IFrame中载入./admin/log.aspx: 选择错误级别即更新Grid: 在TwinTriggerBox中输入需要查询的关键词,回车 ...

最新文章

  1. SAP BW 学习笔记(一)
  2. 算法导论中求解时间复杂度的三种方法
  3. PySide教程:一个简单的点击“.NET研究”按钮示例
  4. P1290 欧几里德的游戏
  5. linux中samba详解,详解linux系列之samba的安装及配置
  6. LNMP环境部署----之Mysql安装部署
  7. CCF201703-3 Markdown(100分)【文本处理】
  8. dfs记忆化搜索(带限制的选择问题) 讲解:LeetCode打家劫舍||| / 蓝桥 地宫取宝/蓝桥 k进制数//剪格子//方格分割
  9. 基于用户画像的商品推荐挑战赛
  10. 风火编程--繁体转简体
  11. 小白入门,Shell脚本,编写脚本显示信息,编写脚本自动创建文件,编写脚本对数据进行双硬盘备份
  12. Linux 卸载Mysql
  13. EPLAN教程——端子图表端子数量超出图框了怎么办
  14. 为什么计算机专业英语很重要,英语对计算机专业的重要性及如何提高英语水平...
  15. 【微信小程序】video视频组件问题
  16. Delphi 全局热键注册+使用
  17. Macbook Pro上运行windows to go
  18. 「医次元」「心际舰队」:论传销洗脑与纳粹之关联
  19. CSS floats来创建三栏网页布局的方法
  20. 如何优雅的消除代码里的NullPointerException!

热门文章

  1. jquery倒计时插件可自定义多个倒计时间
  2. Cordova入门系列(三)Cordova插件调用
  3. ruby gems列表
  4. [Android编程心得] Camera(OpenCV)自动对焦和触摸对焦的实现
  5. C#中调用Windows API时的数据类型对应关系
  6. 呵呵,哈哈,嘿嘿,从今天起就开始写博客文了
  7. 关于程序员的政治(转)
  8. 度量,跟踪和日志记录
  9. Linux内核模块编程入门
  10. SQL Server各种日期计算方法