1.实体类

import lombok.*;
import net.ruifeng.app.cloud.domain.base.AbstractEntityDefault;import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;@Getter
@Setter
@Entity
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "rf_operate_log")
public class OperateLog extends AbstractEntityDefault {private static final long serialVersionUID = -4346566599206393643L;@Column(name = "execMethod",columnDefinition = "varchar(200) COMMENT '请求控制器方法'")private String execMethod;@Column(name = "requestUri",columnDefinition = "varchar(300) COMMENT '请求路径'")private String requestUri;@Column(name = "requestParam",columnDefinition = "text COMMENT '请求参数全部'")private String requestParam;@Column(name = "requestParamSimple",columnDefinition = "text COMMENT '请求参数,头300字符'")private String requestParamSimple;@Column(name = "requestHeader",columnDefinition = "varchar(300) COMMENT '请求业务头信息'")private String requestHeader;@Column(name = "respText",columnDefinition = "mediumtext COMMENT '响应内容'")private String respText;@Column(name = "handleTime",columnDefinition = "int(11) COMMENT '请求业务头信息'")private Integer handleTime;@Column(name = "clientInfo",columnDefinition = "varchar(300) COMMENT '请求客户端信息'")private String clientInfo;@Column(name = "opUser",columnDefinition = "varchar(30) COMMENT '操作用户'")private String opUser;@Column(name = "opUserId",columnDefinition = "varchar(10) COMMENT '操作用户ID'")private String opUserId;@Column(name = "opTime",columnDefinition = "varchar(30) COMMENT '操作时间'")private String opTime;@Column(name = "opCliectIp",columnDefinition = "varchar(30) COMMENT '操作用户IP'")private String opCliectIp;
}

2.保存数据

2.1在请求拦截器中
OperateLog operateLog = OperateLog.builder().requestUri(request.getRequestURI() + (StringUtils.isNotBlank(request.getQueryString()) ? "?" + request.getQueryString() : "")).execMethod(method.getBeanType().getName() + "." + method.getMethod().getName()).requestParam(JSONObject.wrap(request.getParameterMap()).toString()).clientInfo(request.getHeader("Client")).opCliectIp(IpKit.getIpAddr(request)).requestHeader(JSONObject.wrap(header).toString()).requestParamSimple(apiLog.getRequestParam().length() > 300 ? apiLog.getRequestParam().substring(0, 300) : apiLog.getRequestParam()).build();
ThreadLocalKit.set(Enums.ThreadLocalType.OperateLog, operateLog);
operateLog.setOpCliectIp(IpKit.getIpAddr(request));

2.2在请求切面中

OperateLog operateLog = ThreadLocalKit.get(Enums.ThreadLocalType.OperateLog);
if(operateLog != null){operateLog.setRespText(result.toString());operateLog.setHandleTime((int) (System.currentTimeMillis() - time.get()));operateLogService.getDao().save(operateLog);
}

3.工具类ThreadLocalKit

import lombok.extern.slf4j.Slf4j;
import net.ruifeng.app.cloud.core.Enums;import java.util.concurrent.ConcurrentHashMap;/*** ThreadLocal工具类*/
@Slf4j
public class ThreadLocalKit {private static final ThreadLocal<ConcurrentHashMap<String, ?>> threadLocal = new ThreadLocal<>();@SuppressWarnings("unchecked")public static <T> void set(Enums.ThreadLocalType type, T value) {ConcurrentHashMap<String, T> map = (ConcurrentHashMap<String, T>) threadLocal.get();if (map == null) {map = new ConcurrentHashMap<>();}map.put(type.name(), value);threadLocal.set(map);}@SuppressWarnings("unchecked")public static <T> T get(Enums.ThreadLocalType type) {ConcurrentHashMap<String, T> map = (ConcurrentHashMap<String, T>) threadLocal.get();if (map == null) {map = new ConcurrentHashMap<>();}return map.get(type.name());}public static void clear() {threadLocal.remove();}}

4.工具类IpKit

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;import javax.servlet.http.HttpServletRequest;
import java.net.*;
import java.util.Enumeration;
import java.util.List;@Slf4j
public class IpKit {/*** 获取真实IP*/public static String getIpAddr(HttpServletRequest request) {String ip = request.getHeader("x-forwarded-for");// 判断是否为反向代理,多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值,究竟哪个才是真正的用户端的真实IP呢?// 是取X-Forwarded-For中第一个非unknown的有效IP字符串if (ip != null && !"".equals(ip) && !"unknown".equalsIgnoreCase(ip)) {String[] tempArray = ip.split(",");for (String val : tempArray) {if (!"unknown".equalsIgnoreCase(val)) {ip = val.replaceAll("\\s", "");break;}}}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("Proxy-Client-IP");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("WL-Proxy-Client-IP");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("x-forvarded-for");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("x-real-ip");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {try {ip = request.getRemoteAddr();} catch (Exception e) {log.warn(e.getMessage(), e);ip = "unknown";}}return ip;}/*** 获取本机地址*/public static String getLocalIp() {String ip = null;try {Enumeration<?> allNetInterfaces = NetworkInterface.getNetworkInterfaces();while (allNetInterfaces.hasMoreElements()) {NetworkInterface netInterface = (NetworkInterface) allNetInterfaces.nextElement();List<InterfaceAddress> InterfaceAddress = netInterface.getInterfaceAddresses();for (InterfaceAddress add : InterfaceAddress) {InetAddress Ip = add.getAddress();if (Ip != null && Ip instanceof Inet4Address) {ip = Ip.getHostAddress();}}}} catch (SocketException e) {log.warn(e.getMessage(), e);}return ip;}/*** 格式化Mac地址** @param addr 源地址*/public static String formatMacAddr(String addr) {if (StringUtils.isBlank(addr)) {return addr;}String mac = addr.replaceAll("(.{2})", "$1:").toUpperCase();return mac.substring(0, mac.length() - 1);}
}

spring boot记录操作日志相关推荐

  1. Spring aop 记录操作日志 Aspect 自定义注解

    时间过的真快,转眼就一年了,没想到随手写的笔记会被这么多人浏览,不想误人子弟,于是整理了一个优化版,在这里感谢智斌哥提供的建议和帮助,话不多说,进入正题 所需jar包 :spring4.3相关联以及a ...

  2. 【Spring Boot】Spring Boot Logging 示例 | 日志记录

    文章目录 logging.level | 设置日志级别 logging.file | 指定输出日志文件的路径和名称 logging.path | 指定输出日志文件的路径 logging.pattern ...

  3. 如何使用SpringBoot AOP 记录操作日志、异常日志?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:咫尺的梦想_w cnblogs.com/wm-dv/ ...

  4. 【实践】万字干货:如何优雅地记录操作日志?(附代码)

    猜你喜欢 1.如何搭建一套个性化推荐系统? 2.从零开始搭建创业公司后台技术栈 3.某视频APP推荐详解(万字长文) 4.微博推荐算法实践与机器学习平台演进 5.腾讯PCG推荐系统应用实践 6.强化学 ...

  5. 美团的系统是如何记录操作日志?

    来源:美团技术团队 操作日志几乎存在于每个系统中,而这些系统都有记录操作日志的一套 API.操作日志和系统日志不一样,操作日志必须要做到简单易懂.所以如何让操作日志不跟业务逻辑耦合,如何让操作日志的内 ...

  6. SpringBoot AOP 记录操作日志、异常日志

    使用SpringBoot AOP 记录操作日志.异常日志 我们在做项目时经常需要对一些重要功能操作记录日志,方便以后跟踪是谁在操作此功能.在操作某些功能时也有可能会发生异常,但是每次发生异常要定位原因 ...

  7. 记录操作日志(JAVA版某大厂基础实践)

    1. 操作日志的使用场景 2. 实现方式 2.1 使用 Canal 监听数据库记录操作日志 2.2 通过日志文件的方式记录 2.3 通过 LogUtil 的方式记录日志 2.4 方法注解实现操作日志 ...

  8. spring boot中的日志入门

    日志通常不会在需求阶段作为一个功能单独提出来,也不会在产品方案中看到它的细节.但是,这丝毫不影响它在任何一个系统中的重要地位. 报警系统与日志系统的关系 为了保证服务的高可用,发现问题一定要及时,定位 ...

  9. 用aspect在springboot中记录操作日志至数据库的详细过程

    代码来自若依管理系统的后台,我截取的其中用于记录操作日志的部分 1.切面 2.操作日志表 3.spring工具类 4.客户端工具类 异步工厂(产生任务用) 异步任务管理器 5.服务层 6.控制层 1. ...

最新文章

  1. java script 月日年转年月日_js的如何进行日期格式转换成年月日
  2. python java
  3. __declspec关键字详细用法
  4. JavaSE(十七)——IO流之字节流
  5. 攻防世界easyJava(re Moble)
  6. Windows 下更换pip源为阿里源
  7. SAP ECC EHP7 RFC 发布成WebService
  8. 【小游戏】俄罗斯方块(C++版)
  9. ThinkCMF是一款支持Swoole的开源内容管理框架,基于ThinkPHP开发,同时支持PHP-FPM和Swoole双模式,让WEB开发更快!
  10. c语言兔子序列答案,C语言经典题目——兔子生兔子(示例代码)
  11. This iPhone is running iOS 12.2(16E227),which may be supported by this version of Xcode
  12. 我的世界电脑正版服务器地址大全,我的世界服务器地址有哪些_服务器地址大全_3DM网游...
  13. 霍尼韦尔从纽交所转板至纳斯达克上市;全球电竞赛事WSL发布首项赛事计划 | 美通企业日报...
  14. sql vb xml 换行_vb中换行代码 vb代码输出怎么换行
  15. C#酒店客房管理系统设计与实现
  16. 使用EXCEL计算并绘制KDJ指标
  17. 蓝牙耳机排名前十:618性价比超高的真无线蓝牙耳机推荐!
  18. 解决OneNote同步失败的问题
  19. Chrome浏览器整个网页截图
  20. storyboard(故事版)新手教程 图文详解 4.把约束拉成属性 在代码文件里进行修改

热门文章

  1. java主线程控制子线程_CountDownLatch控制主线程等子线程执行完--Java多线程
  2. swap冒泡函数java_一个冒泡排序程序,將交换数组的两个元素的功能用一个Swap()方法实现...
  3. 2008 mysql 本地安全_如何在Linux系统中建立mysql的本地安全机制?
  4. linux下使用python3_Linux上python3的安装和使用
  5. 战神背光键盘如何关系_4000元学生办公游戏本该如何选择?
  6. 杭十四计算机教室,杭十四中学生做了个图书馆智能机器人
  7. 全国计算机二级准考证贵州,贵州计算机二级考试准考证打印时间
  8. Spring添加对缓存的支持
  9. 七十五、SpringBoot 的数据缓存cache(二)
  10. 简单php不用mysql_简单的PHP / MySQL不工作