top.doudou.common.aop.LogData Maven / Gradle / Ivy
package top.doudou.common.aop;
import lombok.Data;
import top.doudou.common.tool.utils.BrowserUtils;
import java.util.Date;
import java.util.Map;
/**
* @Description 自定义日志数据对象 (不提供对外的构造方法,每个线程中仅有一个此对象)
* @Author 傻男人 <[email protected]>
* @Date 2020-09-24 14:53
* @Version V1.0
*/
@Data
public class LogData {
private LogData() {
}
/**
* 请务必注意该对象 使用->释放 原则
*/
private static final ThreadLocal LOG_DATA = new ThreadLocal<>();
/**
* 主机
*/
private String host;
/**
* 端口号
*/
private Integer port;
/**
* 请求的随机id
*/
private String reqCode;
/**
* 请求Ip
*/
private String clientIp;
/**
* 请求地址
*/
private String reqUrl;
/**
* http请求method
*/
private String httpMethod;
/**
* 请求头部信息(可选择记录)
*/
private Map headers;
/**
* 接口名字
*/
private String interfaceName;
/**
* 操作类型(可以根据当前类型去插入到不同的库,比如用户/权限等大类,或者定义其他的东西)
*/
private String type;
/**
* 异常存放的位置与step的记录
*/
private String content;
/**
* 操作方法
*/
private String method;
/**
* 请求的参数
*/
private String args;
/**
* 响应体
*/
private Object respond;
/**
* 操作日期(调用日期)
*/
private Date logDate;
/**
* 业务处理耗时
*/
private long costTime;
/**
* 线程名
*/
private String threadName = Thread.currentThread().getName();
/**
* 线程Id
*/
private long threadId = Thread.currentThread().getId();
/**
* 执行状态 成功(true)/异常(false) 默认失败false
*/
private boolean success = false;
/**
* 请求的来源(手机电脑/浏览器)
*/
private String reqSource;
/**
* 请求头中userAgent的信息
*/
private String userAgent;
public String getReqSource(){
return BrowserUtils.getReqType(userAgent);
}
/**
* 耗时计算
*/
public void toCostTime() {
LogData data = LogData.getCurrent();
data.setCostTime((System.currentTimeMillis() - logDate.getTime()));
LogData.setCurrent(data);
}
/**
* 获取当前线程中的操作日志对象
*/
public static LogData getCurrent() {
LogData data = LOG_DATA.get();
if (data == null) {
data = new LogData();
data.setLogDate(new Date());
LOG_DATA.set(data);
}
return LOG_DATA.get();
}
public static void setCurrent(LogData data) {
LOG_DATA.set(data);
}
/**
* 移除当前线程操作日志对象
*/
public static void removeCurrent() {
LOG_DATA.remove();
}
/**
* 内容记录记录 正常会在aop中结束释放
*
* @param step 这里可以使用 该方法记录每一个步骤 : 注意 调用该方法时 请注意释放 ; 不用此对象时,请 调用 移除当前线程操作日志对象
*/
public static void step(String step) {
LogData data = getCurrent();
if (data.getContent() == null) data.setContent("");
data.setContent(data.getContent() + step + "\n");
setCurrent(data);
}
}