spring boot记录操作日志
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                spring boot记录操作日志
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                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记录操作日志的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Java根据日期计算时间差
- 下一篇: springboot 实现微信小程序授权
