Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
Y
yudao-cloud
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
hblj
yudao-cloud
Commits
20e65bf2
提交
20e65bf2
authored
5月 15, 2020
作者:
hccake
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
🎨
操作日志功能:生产日志部分
上级
7dbe420d
隐藏空白字符变更
内嵌
并排
正在显示
9 个修改的文件
包含
418 行增加
和
0 行删除
+418
-0
pom.xml
system/system-biz/pom.xml
+16
-0
OperationLogging.java
...system/biz/log/operation/annotation/OperationLogging.java
+20
-0
OperationLogAspect.java
...l/system/biz/log/operation/aspect/OperationLogAspect.java
+118
-0
LogStatus.java
...ocoder/mall/system/biz/log/operation/enums/LogStatus.java
+27
-0
OperationLogEvent.java
...all/system/biz/log/operation/event/OperationLogEvent.java
+15
-0
OperationLogListener.java
.../system/biz/log/operation/event/OperationLogListener.java
+26
-0
OperationLogDTO.java
...l/system/biz/log/operation/model/dto/OperationLogDTO.java
+87
-0
OperationLogPO.java
...all/system/biz/log/operation/model/po/OperationLogPO.java
+89
-0
OperationLogSaveService.java
...em/biz/log/operation/service/OperationLogSaveService.java
+20
-0
没有找到文件。
system/system-biz/pom.xml
浏览文件 @
20e65bf2
...
@@ -85,6 +85,22 @@
...
@@ -85,6 +85,22 @@
<artifactId>
fastjson
</artifactId>
<artifactId>
fastjson
</artifactId>
</dependency>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-aop
</artifactId>
</dependency>
<dependency>
<groupId>
org.springframework
</groupId>
<artifactId>
spring-webmvc
</artifactId>
<scope>
compile
</scope>
</dependency>
<dependency>
<groupId>
javax.servlet
</groupId>
<artifactId>
servlet-api
</artifactId>
<scope>
compile
</scope>
</dependency>
</dependencies>
</dependencies>
</project>
</project>
system/system-biz/src/main/java/cn/iocoder/mall/system/biz/log/operation/annotation/OperationLogging.java
0 → 100644
浏览文件 @
20e65bf2
package
cn
.
iocoder
.
mall
.
system
.
biz
.
log
.
operation
.
annotation
;
import
java.lang.annotation.*
;
/**
* @author Hccake
* @version 1.0
* @date 2019/10/15 18:09
*/
@Target
(
ElementType
.
METHOD
)
@Retention
(
RetentionPolicy
.
RUNTIME
)
@Documented
public
@interface
OperationLogging
{
/**
* 日志信息
* @return
*/
String
value
();
}
system/system-biz/src/main/java/cn/iocoder/mall/system/biz/log/operation/aspect/OperationLogAspect.java
0 → 100644
浏览文件 @
20e65bf2
package
cn
.
iocoder
.
mall
.
system
.
biz
.
log
.
operation
.
aspect
;
import
cn.hutool.core.util.ArrayUtil
;
import
cn.hutool.core.util.URLUtil
;
import
cn.hutool.json.JSONUtil
;
import
cn.iocoder.common.framework.util.HttpUtil
;
import
cn.iocoder.common.framework.util.MallUtil
;
import
cn.iocoder.mall.system.biz.log.operation.annotation.OperationLogging
;
import
cn.iocoder.mall.system.biz.log.operation.enums.LogStatus
;
import
cn.iocoder.mall.system.biz.log.operation.event.OperationLogEvent
;
import
cn.iocoder.mall.system.biz.log.operation.model.dto.OperationLogDTO
;
import
lombok.RequiredArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
org.aspectj.lang.ProceedingJoinPoint
;
import
org.aspectj.lang.Signature
;
import
org.aspectj.lang.annotation.Around
;
import
org.aspectj.lang.annotation.Aspect
;
import
org.aspectj.lang.reflect.MethodSignature
;
import
org.springframework.context.ApplicationEventPublisher
;
import
org.springframework.core.annotation.Order
;
import
org.springframework.web.context.request.RequestContextHolder
;
import
org.springframework.web.context.request.ServletRequestAttributes
;
import
javax.servlet.http.HttpServletRequest
;
import
java.util.HashMap
;
import
java.util.Map
;
import
java.util.Objects
;
/**
* @author Hccake
* @version 1.0
* @date 2019/10/15 18:16
*/
@Slf4j
@Aspect
@Order
(
0
)
@RequiredArgsConstructor
public
class
OperationLogAspect
{
private
final
ApplicationEventPublisher
publisher
;
@Around
(
"@annotation(operationLogging)"
)
public
Object
around
(
ProceedingJoinPoint
joinPoint
,
OperationLogging
operationLogging
)
throws
Throwable
{
Signature
signature
=
joinPoint
.
getSignature
();
String
strClassName
=
joinPoint
.
getTarget
().
getClass
().
getName
();
String
strMethodName
=
signature
.
getName
();
log
.
debug
(
"[类名]:{},[方法]:{}"
,
strClassName
,
strMethodName
);
// 获取日志
OperationLogDTO
operationLogDTO
=
prodOperationLog
();
operationLogDTO
.
setMsg
(
operationLogging
.
value
());
// 记录参数
MethodSignature
methodSignature
=
(
MethodSignature
)
signature
;
operationLogDTO
.
setParams
(
getParams
(
joinPoint
,
methodSignature
));
// 开始时间
long
startTime
=
System
.
currentTimeMillis
();
Object
result
;
try
{
result
=
joinPoint
.
proceed
();
}
catch
(
Throwable
throwable
)
{
operationLogDTO
.
setStatus
(
LogStatus
.
FAIL
.
getValue
());
throw
throwable
;
}
// 结束时间
operationLogDTO
.
setResponseTime
((
int
)
(
System
.
currentTimeMillis
()
-
startTime
));
// 发布事件
publisher
.
publishEvent
(
new
OperationLogEvent
(
operationLogDTO
));
return
result
;
}
/**
* 获取方法参数
* @param joinPoint joinPoint
* @param methodSignature 方法签名
* @return 方法参数的Json字符串形式
*/
private
String
getParams
(
ProceedingJoinPoint
joinPoint
,
MethodSignature
methodSignature
)
{
String
[]
parameterNames
=
methodSignature
.
getParameterNames
();
Object
[]
args
=
joinPoint
.
getArgs
();
if
(
ArrayUtil
.
isEmpty
(
parameterNames
)){
return
null
;
}
Map
<
String
,
Object
>
paramsMap
=
new
HashMap
<>();
for
(
int
i
=
0
;
i
<
parameterNames
.
length
;
i
++)
{
paramsMap
.
put
(
parameterNames
[
i
],
args
[
i
]);
}
return
JSONUtil
.
toJsonStr
(
paramsMap
);
}
/**
* 根据请求生成操作日志
* @return 操作日志DTO
*/
private
OperationLogDTO
prodOperationLog
()
{
HttpServletRequest
request
=
((
ServletRequestAttributes
)
Objects
.
requireNonNull
(
RequestContextHolder
.
getRequestAttributes
())).
getRequest
();
return
new
OperationLogDTO
()
.
setTraceId
(
MallUtil
.
getTraceId
())
.
setUri
(
URLUtil
.
getPath
(
request
.
getRequestURI
()))
.
setUserAgent
(
HttpUtil
.
getUserAgent
(
request
))
.
setIp
(
HttpUtil
.
getIp
(
request
))
.
setMethod
(
request
.
getMethod
())
// TODO 获取管理员用户名 或者 用户ID
// .setOperator(Objects.requireNonNull(LogUtils.getUsername()))
.
setStatus
(
LogStatus
.
SUCCESS
.
getValue
());
}
}
system/system-biz/src/main/java/cn/iocoder/mall/system/biz/log/operation/enums/LogStatus.java
0 → 100644
浏览文件 @
20e65bf2
package
cn
.
iocoder
.
mall
.
system
.
biz
.
log
.
operation
.
enums
;
/**
* @author Hccake
* @version 1.0
* @date 2020/5/15 14:47
*/
import
lombok.AllArgsConstructor
;
import
lombok.Getter
;
/**
* 操作状态
*/
@Getter
@AllArgsConstructor
public
enum
LogStatus
{
/**
* 成功
*/
SUCCESS
(
1
),
/**
* 失败
*/
FAIL
(
0
);
private
final
int
value
;
}
system/system-biz/src/main/java/cn/iocoder/mall/system/biz/log/operation/event/OperationLogEvent.java
0 → 100644
浏览文件 @
20e65bf2
package
cn
.
iocoder
.
mall
.
system
.
biz
.
log
.
operation
.
event
;
import
cn.iocoder.mall.system.biz.log.operation.model.dto.OperationLogDTO
;
import
lombok.AllArgsConstructor
;
import
lombok.Getter
;
/**
* @author
* 系统日志事件
*/
@Getter
@AllArgsConstructor
public
class
OperationLogEvent
{
private
final
OperationLogDTO
operationLogDTO
;
}
system/system-biz/src/main/java/cn/iocoder/mall/system/biz/log/operation/event/OperationLogListener.java
0 → 100644
浏览文件 @
20e65bf2
package
cn
.
iocoder
.
mall
.
system
.
biz
.
log
.
operation
.
event
;
import
cn.iocoder.mall.system.biz.log.operation.service.OperationLogSaveService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.context.event.EventListener
;
import
org.springframework.core.annotation.Order
;
import
org.springframework.scheduling.annotation.Async
;
/**
* @author
* 异步监听日志事件
*/
@Slf4j
public
class
OperationLogListener
{
@Autowired
private
OperationLogSaveService
operationLogSaveService
;
@Async
@Order
@EventListener
(
OperationLogEvent
.
class
)
public
void
saveSysLog
(
OperationLogEvent
event
)
{
operationLogSaveService
.
saveLog
(
event
.
getOperationLogDTO
());
}
}
system/system-biz/src/main/java/cn/iocoder/mall/system/biz/log/operation/model/dto/OperationLogDTO.java
0 → 100644
浏览文件 @
20e65bf2
package
cn
.
iocoder
.
mall
.
system
.
biz
.
log
.
operation
.
model
.
dto
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
lombok.experimental.Accessors
;
import
java.time.LocalDateTime
;
/**
* 操作日志
*
* @author hccake
* @date 2020-05-15 15:12:53
*/
@Data
@Accessors
(
chain
=
true
)
@ApiModel
(
value
=
"操作日志"
)
public
class
OperationLogDTO
{
private
static
final
long
serialVersionUID
=
1L
;
/**
* 链路追踪编号
*/
@ApiModelProperty
(
value
=
"链路追踪编号"
)
private
String
traceId
;
/**
* 账号编号
*/
@ApiModelProperty
(
value
=
"账号编号"
)
private
Integer
accountId
;
/**
* 应用名
*/
@ApiModelProperty
(
value
=
"应用名"
)
private
String
applicationName
;
/**
* 访问地址
*/
@ApiModelProperty
(
value
=
"访问地址"
)
private
String
uri
;
/**
* 参数
*/
@ApiModelProperty
(
value
=
"参数"
)
private
String
params
;
/**
* http 方法
*/
@ApiModelProperty
(
value
=
"http 方法"
)
private
String
method
;
/**
* userAgent
*/
@ApiModelProperty
(
value
=
"userAgent"
)
private
String
userAgent
;
/**
* ip
*/
@ApiModelProperty
(
value
=
"ip"
)
private
String
ip
;
/**
* 请求时间
*/
@ApiModelProperty
(
value
=
"请求时间"
)
private
LocalDateTime
startTime
;
/**
* 响应时长 -- 毫秒级
*/
@ApiModelProperty
(
value
=
"响应时长 -- 毫秒级"
)
private
Integer
responseTime
;
/**
* 日志消息
*/
@ApiModelProperty
(
value
=
"日志消息"
)
private
String
msg
;
/**
* 操作状态
*/
@ApiModelProperty
(
value
=
"操作状态"
)
private
Integer
status
;
/**
* 创建者
*/
@ApiModelProperty
(
value
=
"创建者"
)
private
String
operator
;
}
system/system-biz/src/main/java/cn/iocoder/mall/system/biz/log/operation/model/po/OperationLogPO.java
0 → 100644
浏览文件 @
20e65bf2
package
cn
.
iocoder
.
mall
.
system
.
biz
.
log
.
operation
.
model
.
po
;
import
com.baomidou.mybatisplus.annotation.FieldFill
;
import
com.baomidou.mybatisplus.annotation.TableField
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.baomidou.mybatisplus.annotation.TableName
;
import
com.baomidou.mybatisplus.extension.activerecord.Model
;
import
io.swagger.annotations.ApiModel
;
import
lombok.Data
;
import
lombok.EqualsAndHashCode
;
import
java.time.LocalDateTime
;
/**
* 操作日志
*
* @author hccake
* @date 2020-05-15 15:12:53
*/
@Data
@TableName
(
"operation_log"
)
@EqualsAndHashCode
(
callSuper
=
true
)
@ApiModel
(
value
=
"操作日志"
)
public
class
OperationLogPO
extends
Model
<
OperationLogPO
>
{
private
static
final
long
serialVersionUID
=
1L
;
/**
* 编号
*/
@TableId
private
Integer
id
;
/**
* 链路追踪编号
*/
private
String
traceId
;
/**
* 账号编号
*/
private
Integer
accountId
;
/**
* 应用名
*/
private
String
applicationName
;
/**
* 访问地址
*/
private
String
uri
;
/**
* 参数
*/
private
String
params
;
/**
* http 方法
*/
private
String
method
;
/**
* userAgent
*/
private
String
userAgent
;
/**
* ip
*/
private
String
ip
;
/**
* 请求时间
*/
private
LocalDateTime
startTime
;
/**
* 响应时长 -- 毫秒级
*/
private
Integer
responseTime
;
/**
* 日志消息
*/
private
String
msg
;
/**
* 操作状态
*/
private
Integer
status
;
/**
* 创建者
*/
private
String
operator
;
/**
* 创建时间
*/
@TableField
(
fill
=
FieldFill
.
INSERT
)
private
LocalDateTime
createTime
;
}
system/system-biz/src/main/java/cn/iocoder/mall/system/biz/log/operation/service/OperationLogSaveService.java
0 → 100644
浏览文件 @
20e65bf2
package
cn
.
iocoder
.
mall
.
system
.
biz
.
log
.
operation
.
service
;
import
cn.iocoder.mall.system.biz.log.operation.model.dto.OperationLogDTO
;
/**
* 操作日志业务类
* @author Hccake
* @version 1.0
* @date 2019/10/15 19:57
*/
public
interface
OperationLogSaveService
{
/**
* 保存操作日志
* @param operationLogDTO
* @return true/false
*/
boolean
saveLog
(
OperationLogDTO
operationLogDTO
);
}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论