Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
log-platform
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
赵啸非
log-platform
Commits
709888e4
Commit
709888e4
authored
Aug 24, 2022
by
赵啸非
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
异常日志前端展示添加
parent
aefa5c7d
Changes
11
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
1404 additions
and
1255 deletions
+1404
-1255
db/module.sql
db/module.sql
+6
-3
log-manager-ui/admin/src/views/error/log/drawershow.vue
log-manager-ui/admin/src/views/error/log/drawershow.vue
+5
-2
log-manager-ui/admin/src/views/error/log/list.vue
log-manager-ui/admin/src/views/error/log/list.vue
+8
-4
log-manager-ui/admin/src/views/error/log/view.vue
log-manager-ui/admin/src/views/error/log/view.vue
+70
-42
log-manager-ui/admin/src/views/operate/log/list.vue
log-manager-ui/admin/src/views/operate/log/list.vue
+1
-1
log-manager/src/main/java/com/mortals/xhx/base/framework/listener/ErrorMessageConsumerListener.java
...base/framework/listener/ErrorMessageConsumerListener.java
+25
-4
log-manager/src/main/java/com/mortals/xhx/module/error/dao/ibatis/ErrorLogDaoImpl.java
.../mortals/xhx/module/error/dao/ibatis/ErrorLogDaoImpl.java
+13
-0
log-manager/src/main/java/com/mortals/xhx/module/error/model/ErrorLogEntity.java
...va/com/mortals/xhx/module/error/model/ErrorLogEntity.java
+160
-160
log-manager/src/main/java/com/mortals/xhx/module/error/model/ErrorLogQuery.java
...ava/com/mortals/xhx/module/error/model/ErrorLogQuery.java
+463
-424
log-manager/src/main/java/com/mortals/xhx/module/error/service/impl/ErrorLogServiceImpl.java
...ls/xhx/module/error/service/impl/ErrorLogServiceImpl.java
+11
-8
log-manager/src/main/resources/sqlmap/module/error/ErrorLogMapper.xml
...src/main/resources/sqlmap/module/error/ErrorLogMapper.xml
+642
-607
No files found.
db/module.sql
View file @
709888e4
...
...
@@ -59,10 +59,10 @@ CREATE TABLE mortals_xhx_error_log(
`traceID`
varchar
(
64
)
COMMENT
'追踪Id'
,
`appName`
varchar
(
64
)
COMMENT
'应用名称,宿主客户端运行唯一标识。'
,
`hostName`
varchar
(
64
)
COMMENT
'主机名'
,
`message`
varchar
(
256
)
COMMENT
'消息标识,如用户登录异常。'
,
`message`
varchar
(
1024
)
COMMENT
'消息标识,如用户登录异常。'
,
`platform`
varchar
(
64
)
COMMENT
'当前客户端使用平台(java,php,c#,android,vue,webos,ios,python)'
,
`culprit`
varchar
(
512
)
COMMENT
'主要导致异常函数或方法调用名称
'
,
`tags`
varchar
(
512
)
COMMENT
'异常事件标记,多个逗号分隔。用以归集异常事件种类。'
,
`culprit`
varchar
(
2048
)
COMMENT
'主要导致异常函数或方法调用名称及入参
'
,
`tags`
varchar
(
256
)
COMMENT
'异常事件标记,多个逗号分隔。用以归集异常事件种类。'
,
`level`
varchar
(
64
)
COMMENT
'等级(FATAL,ERROR,WARNING,INFO,DEBUG)'
,
`environment`
varchar
(
1024
)
COMMENT
'客户端运行环境变量信息'
,
`releaseVersion`
varchar
(
64
)
COMMENT
'客户端运行版本信息'
,
...
...
@@ -75,10 +75,13 @@ CREATE TABLE mortals_xhx_error_log(
`logTime`
datetime
COMMENT
'日志时间'
,
`createUserId`
bigint
(
20
)
COMMENT
'创建用户'
,
`createTime`
datetime
NOT
NULL
COMMENT
'创建时间'
,
`updateTime`
datetime
COMMENT
'更新时间'
,
PRIMARY
KEY
(
`id`
)
)
ENGINE
=
InnoDB
DEFAULT
CHARSET
=
utf8
COMMENT
=
'异常日志'
;
-- ----------------------------
-- 平台用户操作日志业务表
-- ----------------------------
...
...
log-manager-ui/admin/src/views/error/log/drawershow.vue
View file @
709888e4
...
...
@@ -21,8 +21,8 @@
<Field
label=
"线程号"
prop=
"threadNo"
v-model=
"form.threadNo"
placeholder=
"请输入线程号"
/>
<Field
label=
"异常事件数量"
prop=
"checkNum"
v-model=
"form.checkNum"
placeholder=
"请输入针对同一个异常事件,数量加1"
/>
<Field
label=
"日志时间"
prop=
"logTime"
v-model=
"form.logTime"
type=
"date"
/>
<Field
label=
"异常堆栈信息"
:span=
"24"
prop=
"errorStack"
v-model=
"form.errorStack"
rows=
"
6
"
type=
"textarea"
placeholder=
"请输入异常堆栈信息"
/>
<Field
label=
"上下文信息"
:span=
"24"
prop=
"context"
v-model=
"form.context"
type=
"textarea"
placeholder=
"请输入上下文信息,如js中发送异常事件,定位源码中信息。"
/>
<Field
label=
"异常堆栈信息"
:span=
"24"
prop=
"errorStack"
v-model=
"form.errorStack"
rows=
"
8
"
type=
"textarea"
placeholder=
"请输入异常堆栈信息"
/>
<Field
label=
"上下文信息"
:span=
"24"
prop=
"context"
v-model=
"form.context"
type=
"textarea"
rows=
"6"
placeholder=
"请输入上下文信息,如js中发送异常事件,定位源码中信息。"
/>
<Field
label=
"扩展信息"
:span=
"24"
prop=
"extra"
v-model=
"form.extra"
type=
"textarea"
placeholder=
"请输入扩展信息"
/>
...
...
@@ -34,6 +34,9 @@
<
script
>
import
form
from
"
@/assets/mixins/formdialog
"
;
// import hljs from "highlight.js/lib/highlight";
// import "highlight.js/styles/github-gist.css";
// hljs.registerLanguage("java", require("highlight.js/lib/languages/java"));
export
default
{
name
:
"
ErrorLogDetail
"
,
mixins
:
[
form
],
...
...
log-manager-ui/admin/src/views/error/log/list.vue
View file @
709888e4
...
...
@@ -5,6 +5,8 @@
<drawer-show
ref=
"drawerform"
@
ok=
"getData"
/>
<drawer-view
ref=
"drawerview"
@
ok=
"getData"
/>
</div>
</
template
>
...
...
@@ -12,11 +14,13 @@
/** 表单弹出框模式需引入 */
import
drawerShow
from
"
./drawershow
"
;
import
drawerView
from
"
./view
"
;
import
table
from
"
@/assets/mixins/table
"
;
export
default
{
name
:
"
ErrorLogList
"
,
components
:
{
drawerShow
drawerShow
,
drawerView
},
mixins
:
[
table
],
created
()
{
...
...
@@ -32,7 +36,7 @@
},
/** 重写查看方法 */
toView
(
row
)
{
this
.
$refs
.
drawer
form
.
view
(
row
);
this
.
$refs
.
drawer
view
.
view
(
row
);
},
},
...
...
@@ -61,9 +65,9 @@
{
label
:
"
应用名称
"
,
prop
:
"
appName
"
},
{
label
:
"
主机名
"
,
prop
:
"
hostName
"
},
//
{label: "主机名", prop: "hostName"},
{
label
:
"
消息标识
"
,
prop
:
"
message
"
},
{
label
:
"
消息标识
"
,
prop
:
"
message
"
,
tooltip
:
"
true
"
},
{
label
:
"
当前客户端使用平台
"
,
prop
:
"
platform
"
,
formatter
:
this
.
formatter
},
...
...
log-manager-ui/admin/src/views/error/log/view.vue
View file @
709888e4
<
template
>
<layout-view>
<el-descriptions
:title=
"title"
:column=
"column"
:size=
"size"
:colon=
"false"
border
>
<template
slot=
"title"
>
<i
class=
"el-icon-tickets"
></i>
基本详细信息
</
template
>
<
template
slot=
"extra"
>
<el-button
type=
"primary"
@
click=
"$router.go(-1)"
size=
"small"
>
返回
</el-button>
</
template
>
<el-descriptions-item
label=
"追踪Id"
label-class-name=
"labelClass"
content-class-name=
"contentClass"
>
<el-drawer
:title=
"title"
:visible.sync=
"open"
:direction=
"direction"
size=
"75%"
>
<el-descriptions
:column=
"column"
:size=
"size"
:colon=
"false"
border
>
<el-descriptions-item
label=
"TraceId"
label-class-name=
"labelClass"
content-class-name=
"contentClass"
>
{{
form
.
traceID
}}
</el-descriptions-item>
<el-descriptions-item
label=
"应用
名称,宿主客户端运行唯一标识。
"
label-class-name=
"labelClass"
content-class-name=
"contentClass"
>
<el-descriptions-item
label=
"应用
标识
"
label-class-name=
"labelClass"
content-class-name=
"contentClass"
>
{{
form
.
appName
}}
</el-descriptions-item>
<el-descriptions-item
label=
"主机名"
label-class-name=
"labelClass"
content-class-name=
"contentClass"
>
<
!--
<
el-descriptions-item
label=
"主机名"
label-class-name=
"labelClass"
content-class-name=
"contentClass"
>
{{
form
.
hostName
}}
</el-descriptions-item>
<el-descriptions-item
label=
"消息标识
,如用户登录异常。
"
label-class-name=
"labelClass"
content-class-name=
"contentClass"
>
</el-descriptions-item>
-->
<el-descriptions-item
label=
"消息标识"
label-class-name=
"labelClass"
content-class-name=
"contentClass"
>
{{
form
.
message
}}
</el-descriptions-item>
<el-descriptions-item
label=
"
当前客户端使用
平台"
label-class-name=
"labelClass"
content-class-name=
"contentClass"
>
{{
util_formatters("platform", form.platform)
}}
<el-descriptions-item
label=
"
所属
平台"
label-class-name=
"labelClass"
content-class-name=
"contentClass"
>
{{
form
.
platform
}}
</el-descriptions-item>
<el-descriptions-item
label=
"
主要导致异常函数或方法
调用名称"
label-class-name=
"labelClass"
content-class-name=
"contentClass"
>
<el-descriptions-item
label=
"
函数
调用名称"
label-class-name=
"labelClass"
content-class-name=
"contentClass"
>
{{
form
.
culprit
}}
</el-descriptions-item>
<el-descriptions-item
label=
"异常事件标记
,多个逗号分隔。用以归集异常事件种类。
"
label-class-name=
"labelClass"
content-class-name=
"contentClass"
>
<el-descriptions-item
label=
"异常事件标记"
label-class-name=
"labelClass"
content-class-name=
"contentClass"
>
{{
form
.
tags
}}
</el-descriptions-item>
<el-descriptions-item
label=
"等级"
label-class-name=
"labelClass"
content-class-name=
"contentClass"
>
{{ util_formatters("level", form.level) }}
</el-descriptions-item>
<el-descriptions-item
label=
"客户端运行环境变量信息"
label-class-name=
"labelClass"
content-class-name=
"contentClass"
>
{{form.environment}}
</el-descriptions-item>
<el-descriptions-item
label=
"客户端运行版本信息"
label-class-name=
"labelClass"
content-class-name=
"contentClass"
>
{{form.releaseVersion}}
</el-descriptions-item>
<el-descriptions-item
label=
"指纹标识,对于相同异常事件归集数量使用。"
label-class-name=
"labelClass"
content-class-name=
"contentClass"
>
{{form.fingerprint}}
<el-descriptions-item
label=
"告警等级"
label-class-name=
"labelClass"
content-class-name=
"contentClass"
>
{{
form
.
level
}}
</el-descriptions-item>
<el-descriptions-item
label=
"线程号"
label-class-name=
"labelClass"
content-class-name=
"contentClass"
>
{{
form
.
threadNo
}}
</el-descriptions-item>
<el-descriptions-item
label=
"针对同一个异常事件,数量加1"
label-class-name=
"labelClass"
content-class-name=
"contentClass"
>
{{form.checkNum}}
</el-descriptions-item>
<el-descriptions-item
label=
"异常堆栈信息"
label-class-name=
"labelClass"
content-class-name=
"contentClass"
>
{{
form
.
errorStack
}}
</el-descriptions-item>
<el-descriptions-item
label=
"上下文信息
,如js中发送异常事件,定位源码中信息。
"
label-class-name=
"labelClass"
content-class-name=
"contentClass"
>
<el-descriptions-item
label=
"上下文信息"
label-class-name=
"labelClass"
content-class-name=
"contentClass"
>
{{
form
.
context
}}
</el-descriptions-item>
<el-descriptions-item
label=
"环境变量"
label-class-name=
"labelClass"
content-class-name=
"contentClass"
>
{{
form
.
environment
}}
</el-descriptions-item>
<el-descriptions-item
label=
"版本信息"
label-class-name=
"labelClass"
content-class-name=
"contentClass"
>
{{
form
.
releaseVersion
}}
</el-descriptions-item>
<el-descriptions-item
label=
"指纹标识"
label-class-name=
"labelClass"
content-class-name=
"contentClass"
>
{{
form
.
fingerprint
}}
</el-descriptions-item>
<el-descriptions-item
label=
"扩展信息"
label-class-name=
"labelClass"
content-class-name=
"contentClass"
>
{{
form
.
extra
}}
</el-descriptions-item>
<el-descriptions-item
label=
"异常事件数量"
label-class-name=
"labelClass"
content-class-name=
"contentClass"
>
{{
form
.
checkNum
}}
</el-descriptions-item>
<el-descriptions-item
label=
"日志时间"
label-class-name=
"labelClass"
content-class-name=
"contentClass"
>
{{
util_formatterDate(form.logTime)
}}
{{
form
.
logTime
}}
</el-descriptions-item>
</el-descriptions>
</el-drawer>
</layout-view>
</
template
>
<
script
>
import
view
from
"
@/assets/mixins/view
"
;
import
formatterDate
from
"
@/assets/utils/index.js
"
;
export
default
{
mixins
:
[
view
],
components
:
{
},
methods
:
{
methods
:
{
formatterDate
,
/** 查看*/
view
(
row
)
{
this
.
query
=
{
id
:
row
.
id
};
this
.
urls
.
currUrl
=
"
error/log/view
"
;
this
.
getData
();
this
.
pageInfo
.
type
=
"
view
"
this
.
title
=
"
异常日志详细
"
;
},
/**获取数据后弹框 */
afterRender
(
data
)
{
this
.
open
=
true
;
},
},
data
()
{
return
{
size
:
"
small
"
,
column
:
2
,
column
:
1
,
loading
:
true
,
// 弹出层标题
title
:
"
异常日志
"
,
// 是否显示弹出层
open
:
false
,
direction
:
"
rtl
"
,
toString
:[
],
toArrays
:
[
],
toDate
:
[
]
toDate
:
[
"
logTime
"
,
]
,
}
}
}
</
script
>
<
style
lang=
"less"
>
.labelClass{
width: 200px;
width: 250px;
font-size: 13px;
}
.el-descriptions-item__label{
color: #191a1b;
}
.el-descriptions__body{
margin-left: 5px;
margin-right: 5px;
color: #
606266
;
color: #
191a1b
;
background-color: #FFF;
}
.contentClass{
width:
6
00px;
width:
5
00px;
}
</
style
>
\ No newline at end of file
log-manager-ui/admin/src/views/operate/log/list.vue
View file @
709888e4
...
...
@@ -65,7 +65,7 @@
{
label
:
"
请求地址
"
,
prop
:
"
requestUrl
"
},
{
label
:
"
操作内容
"
,
prop
:
"
content
"
},
{
label
:
"
操作内容
"
,
prop
:
"
content
"
,
tooltip
:
"
true
"
},
{
label
:
"
操作IP地址
"
,
prop
:
"
ip
"
},
...
...
log-manager/src/main/java/com/mortals/xhx/base/framework/listener/ErrorMessageConsumerListener.java
View file @
709888e4
...
...
@@ -6,6 +6,7 @@ import com.mortals.xhx.module.access.model.AccessLogEntity;
import
com.mortals.xhx.module.biz.model.BizLogEntity
;
import
com.mortals.xhx.module.biz.service.BizLogService
;
import
com.mortals.xhx.module.error.model.ErrorLogEntity
;
import
com.mortals.xhx.module.error.model.ErrorLogQuery
;
import
com.mortals.xhx.module.error.service.ErrorLogService
;
import
com.rabbitmq.client.Channel
;
import
lombok.extern.slf4j.Slf4j
;
...
...
@@ -15,6 +16,7 @@ import org.springframework.amqp.support.AmqpHeaders;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.messaging.handler.annotation.Headers
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.ObjectUtils
;
import
java.util.Date
;
import
java.util.List
;
...
...
@@ -41,12 +43,31 @@ public class ErrorMessageConsumerListener {
public
void
onMessage
(
List
<
String
>
messages
)
throws
Exception
{
log
.
info
(
"[onMessage][线程编号:{} 消息数量:{}]"
,
Thread
.
currentThread
().
getId
(),
messages
.
size
());
List
<
ErrorLogEntity
>
collect
=
messages
.
stream
().
map
(
str
->
{
messages
.
stream
().
peek
(
str
->
{
ErrorLogEntity
entity
=
JSON
.
parseObject
(
str
,
ErrorLogEntity
.
class
);
entity
.
setCreateUserId
(
1L
);
entity
.
setCreateTime
(
new
Date
());
return
entity
;
}).
collect
(
Collectors
.
toList
());
errorLogService
.
save
(
collect
);
if
(!
ObjectUtils
.
isEmpty
(
entity
.
getFingerprint
()))
{
//// TODO: 2022/8/24 指纹匹配
}
else
{
//比较message platform appname 如果相同 则checknum+1 并更新日志时间
ErrorLogQuery
errorLogQuery
=
new
ErrorLogQuery
();
errorLogQuery
.
setAppName
(
entity
.
getAppName
());
errorLogQuery
.
setPlatform
(
entity
.
getPlatform
());
errorLogQuery
.
setMessage
(
entity
.
getMessage
());
ErrorLogEntity
errorLogEntity
=
errorLogService
.
selectOne
(
errorLogQuery
,
null
);
if
(!
ObjectUtils
.
isEmpty
(
errorLogEntity
))
{
errorLogEntity
.
setCheckNum
(
errorLogEntity
.
getCheckNum
()+
1
);
errorLogEntity
.
setLogTime
(
entity
.
getLogTime
());
errorLogEntity
.
setThreadNo
(
entity
.
getThreadNo
());
errorLogEntity
.
setUpdateTime
(
new
Date
());
errorLogService
.
update
(
errorLogEntity
);
}
else
{
errorLogService
.
save
(
entity
);
}
}
}).
count
();
}
}
log-manager/src/main/java/com/mortals/xhx/module/error/dao/ibatis/ErrorLogDaoImpl.java
View file @
709888e4
package
com.mortals.xhx.module.error.dao.ibatis
;
import
cn.hutool.core.lang.Snowflake
;
import
cn.hutool.core.util.IdUtil
;
import
org.springframework.stereotype.Repository
;
import
com.mortals.xhx.module.error.dao.ErrorLogDao
;
import
com.mortals.xhx.module.error.model.ErrorLogEntity
;
...
...
@@ -48,4 +50,15 @@ public class ErrorLogDaoImpl extends SubmeterDaoImpl<ErrorLogEntity,Long> implem
@Override
public
ErrorLogEntity
get
(
Long
id
)
{
ErrorLogEntity
errorLogEntity
=
new
ErrorLogEntity
();
Snowflake
snowflake
=
IdUtil
.
getSnowflake
(
0
,
1
);
long
generateDateTime
=
snowflake
.
getGenerateDateTime
(
id
);
errorLogEntity
.
setCreateTime
(
new
Date
(
generateDateTime
));
return
this
.
get
(
id
,
errorLogEntity
);
}
}
log-manager/src/main/java/com/mortals/xhx/module/error/model/ErrorLogEntity.java
View file @
709888e4
This diff is collapsed.
Click to expand it.
log-manager/src/main/java/com/mortals/xhx/module/error/model/ErrorLogQuery.java
View file @
709888e4
This diff is collapsed.
Click to expand it.
log-manager/src/main/java/com/mortals/xhx/module/error/service/impl/ErrorLogServiceImpl.java
View file @
709888e4
...
...
@@ -2,6 +2,7 @@ package com.mortals.xhx.module.error.service.impl;
import
cn.hutool.core.lang.Snowflake
;
import
com.mortals.xhx.module.access.model.AccessLogEntity
;
import
com.mortals.xhx.module.error.model.ErrorLogQuery
;
import
org.springframework.stereotype.Service
;
import
com.mortals.framework.service.impl.AbstractCRUDServiceImpl
;
import
com.mortals.framework.exception.AppException
;
...
...
@@ -10,6 +11,7 @@ import com.mortals.xhx.module.error.dao.ErrorLogDao;
import
com.mortals.xhx.module.error.model.ErrorLogEntity
;
import
com.mortals.xhx.module.error.service.ErrorLogService
;
import
cn.hutool.core.util.IdUtil
;
import
org.springframework.util.ObjectUtils
;
import
java.util.Date
;
import
java.util.List
;
...
...
@@ -25,8 +27,16 @@ import java.util.List;
public
class
ErrorLogServiceImpl
extends
AbstractCRUDServiceImpl
<
ErrorLogDao
,
ErrorLogEntity
,
Long
>
implements
ErrorLogService
{
@Override
protected
void
saveBefore
(
ErrorLogEntity
entity
,
Context
context
)
throws
AppException
{
//判断当前是否有重复的
//非系统自增,需这里设置主键
entity
.
setId
(
IdUtil
.
getSnowflake
(
0
,
1
).
nextId
());
super
.
saveBefore
(
entity
,
context
);
}
...
...
@@ -38,12 +48,5 @@ public class ErrorLogServiceImpl extends AbstractCRUDServiceImpl<ErrorLogDao, Er
return
super
.
save
(
list
,
context
);
}
@Override
public
ErrorLogEntity
get
(
Long
key
,
Context
context
)
throws
AppException
{
ErrorLogEntity
errorLogEntity
=
new
ErrorLogEntity
();
Snowflake
snowflake
=
IdUtil
.
getSnowflake
(
0
,
1
);
long
generateDateTime
=
snowflake
.
getGenerateDateTime
(
key
);
errorLogEntity
.
setCreateTime
(
new
Date
(
generateDateTime
));
return
this
.
getDao
().
get
(
key
,
errorLogEntity
);
}
}
\ No newline at end of file
log-manager/src/main/resources/sqlmap/module/error/ErrorLogMapper.xml
View file @
709888e4
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment