Skip to content

Commit 8cce9ed

Browse files
author
piexlMax(奇淼
committed
feat(错误日志): 实现错误日志记录功能并修复拼写错误
添加错误日志记录功能,包括API、路由、服务和前端接口 修复sysError相关变量名的拼写错误 更新依赖版本至go 1.24 使用自定义Recovery中间件记录panic信息 添加zap日志钩子将错误日志写入数据库
1 parent 6bea7bc commit 8cce9ed

File tree

14 files changed

+214
-98
lines changed

14 files changed

+214
-98
lines changed

server/api/v1/system/enter.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,5 +47,5 @@ var (
4747
autoCodeHistoryService = service.ServiceGroupApp.SystemServiceGroup.AutoCodeHistory
4848
autoCodeTemplateService = service.ServiceGroupApp.SystemServiceGroup.AutoCodeTemplate
4949
sysVersionService = service.ServiceGroupApp.SystemServiceGroup.SysVersionService
50-
sysErrprService = service.ServiceGroupApp.SystemServiceGroup.SysErrorService
50+
sysErrorService = service.ServiceGroupApp.SystemServiceGroup.SysErrorService
5151
)

server/api/v1/system/sys_error.go

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,18 @@ type SysErrorApi struct{}
1919
// @Produce application/json
2020
// @Param data body system.SysError true "创建错误日志"
2121
// @Success 200 {object} response.Response{msg=string} "创建成功"
22-
// @Router /sysErrpr/createSysError [post]
23-
func (sysErrprApi *SysErrorApi) CreateSysError(c *gin.Context) {
22+
// @Router /sysError/createSysError [post]
23+
func (sysErrorApi *SysErrorApi) CreateSysError(c *gin.Context) {
2424
// 创建业务用Context
2525
ctx := c.Request.Context()
2626

27-
var sysErrpr system.SysError
28-
err := c.ShouldBindJSON(&sysErrpr)
27+
var sysError system.SysError
28+
err := c.ShouldBindJSON(&sysError)
2929
if err != nil {
3030
response.FailWithMessage(err.Error(), c)
3131
return
3232
}
33-
err = sysErrprService.CreateSysError(ctx, &sysErrpr)
33+
err = sysErrorService.CreateSysError(ctx, &sysError)
3434
if err != nil {
3535
global.GVA_LOG.Error("创建失败!", zap.Error(err))
3636
response.FailWithMessage("创建失败:"+err.Error(), c)
@@ -47,13 +47,13 @@ func (sysErrprApi *SysErrorApi) CreateSysError(c *gin.Context) {
4747
// @Produce application/json
4848
// @Param data body system.SysError true "删除错误日志"
4949
// @Success 200 {object} response.Response{msg=string} "删除成功"
50-
// @Router /sysErrpr/deleteSysError [delete]
51-
func (sysErrprApi *SysErrorApi) DeleteSysError(c *gin.Context) {
50+
// @Router /sysError/deleteSysError [delete]
51+
func (sysErrorApi *SysErrorApi) DeleteSysError(c *gin.Context) {
5252
// 创建业务用Context
5353
ctx := c.Request.Context()
5454

5555
ID := c.Query("ID")
56-
err := sysErrprService.DeleteSysError(ctx, ID)
56+
err := sysErrorService.DeleteSysError(ctx, ID)
5757
if err != nil {
5858
global.GVA_LOG.Error("删除失败!", zap.Error(err))
5959
response.FailWithMessage("删除失败:"+err.Error(), c)
@@ -69,13 +69,13 @@ func (sysErrprApi *SysErrorApi) DeleteSysError(c *gin.Context) {
6969
// @Accept application/json
7070
// @Produce application/json
7171
// @Success 200 {object} response.Response{msg=string} "批量删除成功"
72-
// @Router /sysErrpr/deleteSysErrorByIds [delete]
73-
func (sysErrprApi *SysErrorApi) DeleteSysErrorByIds(c *gin.Context) {
72+
// @Router /sysError/deleteSysErrorByIds [delete]
73+
func (sysErrorApi *SysErrorApi) DeleteSysErrorByIds(c *gin.Context) {
7474
// 创建业务用Context
7575
ctx := c.Request.Context()
7676

7777
IDs := c.QueryArray("IDs[]")
78-
err := sysErrprService.DeleteSysErrorByIds(ctx, IDs)
78+
err := sysErrorService.DeleteSysErrorByIds(ctx, IDs)
7979
if err != nil {
8080
global.GVA_LOG.Error("批量删除失败!", zap.Error(err))
8181
response.FailWithMessage("批量删除失败:"+err.Error(), c)
@@ -92,18 +92,18 @@ func (sysErrprApi *SysErrorApi) DeleteSysErrorByIds(c *gin.Context) {
9292
// @Produce application/json
9393
// @Param data body system.SysError true "更新错误日志"
9494
// @Success 200 {object} response.Response{msg=string} "更新成功"
95-
// @Router /sysErrpr/updateSysError [put]
96-
func (sysErrprApi *SysErrorApi) UpdateSysError(c *gin.Context) {
95+
// @Router /sysError/updateSysError [put]
96+
func (sysErrorApi *SysErrorApi) UpdateSysError(c *gin.Context) {
9797
// 从ctx获取标准context进行业务行为
9898
ctx := c.Request.Context()
9999

100-
var sysErrpr system.SysError
101-
err := c.ShouldBindJSON(&sysErrpr)
100+
var sysError system.SysError
101+
err := c.ShouldBindJSON(&sysError)
102102
if err != nil {
103103
response.FailWithMessage(err.Error(), c)
104104
return
105105
}
106-
err = sysErrprService.UpdateSysError(ctx, sysErrpr)
106+
err = sysErrorService.UpdateSysError(ctx, sysError)
107107
if err != nil {
108108
global.GVA_LOG.Error("更新失败!", zap.Error(err))
109109
response.FailWithMessage("更新失败:"+err.Error(), c)
@@ -120,19 +120,19 @@ func (sysErrprApi *SysErrorApi) UpdateSysError(c *gin.Context) {
120120
// @Produce application/json
121121
// @Param ID query uint true "用id查询错误日志"
122122
// @Success 200 {object} response.Response{data=system.SysError,msg=string} "查询成功"
123-
// @Router /sysErrpr/findSysError [get]
124-
func (sysErrprApi *SysErrorApi) FindSysError(c *gin.Context) {
123+
// @Router /sysError/findSysError [get]
124+
func (sysErrorApi *SysErrorApi) FindSysError(c *gin.Context) {
125125
// 创建业务用Context
126126
ctx := c.Request.Context()
127127

128128
ID := c.Query("ID")
129-
resysErrpr, err := sysErrprService.GetSysError(ctx, ID)
129+
resysError, err := sysErrorService.GetSysError(ctx, ID)
130130
if err != nil {
131131
global.GVA_LOG.Error("查询失败!", zap.Error(err))
132132
response.FailWithMessage("查询失败:"+err.Error(), c)
133133
return
134134
}
135-
response.OkWithData(resysErrpr, c)
135+
response.OkWithData(resysError, c)
136136
}
137137

138138
// GetSysErrorList 分页获取错误日志列表
@@ -143,8 +143,8 @@ func (sysErrprApi *SysErrorApi) FindSysError(c *gin.Context) {
143143
// @Produce application/json
144144
// @Param data query systemReq.SysErrorSearch true "分页获取错误日志列表"
145145
// @Success 200 {object} response.Response{data=response.PageResult,msg=string} "获取成功"
146-
// @Router /sysErrpr/getSysErrorList [get]
147-
func (sysErrprApi *SysErrorApi) GetSysErrorList(c *gin.Context) {
146+
// @Router /sysError/getSysErrorList [get]
147+
func (sysErrorApi *SysErrorApi) GetSysErrorList(c *gin.Context) {
148148
// 创建业务用Context
149149
ctx := c.Request.Context()
150150

@@ -154,7 +154,7 @@ func (sysErrprApi *SysErrorApi) GetSysErrorList(c *gin.Context) {
154154
response.FailWithMessage(err.Error(), c)
155155
return
156156
}
157-
list, total, err := sysErrprService.GetSysErrorInfoList(ctx, pageInfo)
157+
list, total, err := sysErrorService.GetSysErrorInfoList(ctx, pageInfo)
158158
if err != nil {
159159
global.GVA_LOG.Error("获取失败!", zap.Error(err))
160160
response.FailWithMessage("获取失败:"+err.Error(), c)

server/core/zap.go

Lines changed: 49 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
package core
22

33
import (
4+
"context"
45
"fmt"
56
"github.com/flipped-aurora/gin-vue-admin/server/core/internal"
67
"github.com/flipped-aurora/gin-vue-admin/server/global"
8+
"github.com/flipped-aurora/gin-vue-admin/server/model/system"
9+
"github.com/flipped-aurora/gin-vue-admin/server/service"
710
"github.com/flipped-aurora/gin-vue-admin/server/utils"
811
"go.uber.org/zap"
912
"go.uber.org/zap/zapcore"
1013
"os"
14+
"strings"
1115
)
1216

1317
// Zap 获取 zap.Logger
@@ -24,9 +28,49 @@ func Zap() (logger *zap.Logger) {
2428
core := internal.NewZapCore(levels[i])
2529
cores = append(cores, core)
2630
}
27-
logger = zap.New(zapcore.NewTee(cores...))
28-
if global.GVA_CONFIG.Zap.ShowLine {
29-
logger = logger.WithOptions(zap.AddCaller())
30-
}
31-
return logger
31+
// 通过 Hooks 捕捉 Error 及以上级别日志,写入系统错误表
32+
dbHook := zap.Hooks(func(entry zapcore.Entry) error {
33+
// 仅处理 Error 及以上级别
34+
if entry.Level < zapcore.ErrorLevel {
35+
return nil
36+
}
37+
// 避免与 GORM zap 写入互相递归:跳过由 gorm logger writer 触发的日志
38+
if strings.Contains(entry.Caller.File, "gorm_logger_writer.go") {
39+
return nil
40+
}
41+
// 避免重复记录 panic 恢复日志,panic 由 GinRecovery 单独捕捉入库
42+
if strings.Contains(entry.Message, "[Recovery from panic]") {
43+
return nil
44+
}
45+
46+
form := "后端"
47+
level := entry.Level.String()
48+
// 尽可能携带来源与堆栈信息(使用 runtime 采集并过滤 zap 内部栈)
49+
info := entry.Message
50+
if entry.Caller.File != "" {
51+
info = fmt.Sprintf("%s | caller=%s:%d", info, entry.Caller.File, entry.Caller.Line)
52+
}
53+
stack := entry.Stack
54+
if stack != "" {
55+
info = fmt.Sprintf("%s | stack=%s", info, stack)
56+
}
57+
58+
// 使用后台上下文,避免依赖 gin.Context
59+
ctx := context.Background()
60+
_ = service.ServiceGroupApp.SystemServiceGroup.SysErrorService.CreateSysError(ctx, &system.SysError{
61+
Form: &form,
62+
Info: &info,
63+
Level: level,
64+
})
65+
return nil
66+
})
67+
68+
logger = zap.New(zapcore.NewTee(cores...), dbHook)
69+
// 启用 Error 及以上级别的堆栈捕捉,确保 entry.Stack 可用
70+
opts := []zap.Option{zap.AddStacktrace(zapcore.ErrorLevel)}
71+
if global.GVA_CONFIG.Zap.ShowLine {
72+
opts = append(opts, zap.AddCaller())
73+
}
74+
logger = logger.WithOptions(opts...)
75+
return logger
3276
}

server/go.mod

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
module github.com/flipped-aurora/gin-vue-admin/server
22

3-
go 1.23
3+
go 1.24.0
44

5-
toolchain go1.23.9
5+
toolchain go1.24.2
66

77
require (
88
github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible
@@ -20,6 +20,7 @@ require (
2020
github.com/gookit/color v1.5.4
2121
github.com/huaweicloud/huaweicloud-sdk-go-obs v3.24.9+incompatible
2222
github.com/jordan-wright/email v4.0.1-0.20210109023952-943e75fe5223+incompatible
23+
github.com/localrivet/gomcp v1.7.2
2324
github.com/mark3labs/mcp-go v0.41.1
2425
github.com/mholt/archives v0.1.1
2526
github.com/minio/minio-go/v7 v7.0.84
@@ -43,9 +44,9 @@ require (
4344
go.mongodb.org/mongo-driver v1.17.2
4445
go.uber.org/automaxprocs v1.6.0
4546
go.uber.org/zap v1.27.0
46-
golang.org/x/crypto v0.32.0
47-
golang.org/x/sync v0.10.0
48-
golang.org/x/text v0.21.0
47+
golang.org/x/crypto v0.37.0
48+
golang.org/x/sync v0.13.0
49+
golang.org/x/text v0.24.0
4950
gorm.io/datatypes v1.2.5
5051
gorm.io/driver/mysql v1.5.7
5152
gorm.io/driver/postgres v1.5.11
@@ -77,6 +78,7 @@ require (
7778
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
7879
github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707 // indirect
7980
github.com/dustin/go-humanize v1.0.1 // indirect
81+
github.com/eclipse/paho.mqtt.golang v1.5.0 // indirect
8082
github.com/emirpasic/gods v1.12.0 // indirect
8183
github.com/gabriel-vasile/mimetype v1.4.8 // indirect
8284
github.com/gammazero/toposort v0.1.1 // indirect
@@ -91,12 +93,16 @@ require (
9193
github.com/go-playground/locales v0.14.1 // indirect
9294
github.com/go-playground/universal-translator v0.18.1 // indirect
9395
github.com/go-playground/validator/v10 v10.24.0 // indirect
96+
github.com/gobwas/httphead v0.1.0 // indirect
97+
github.com/gobwas/pool v0.2.1 // indirect
98+
github.com/gobwas/ws v1.4.0 // indirect
9499
github.com/gofrs/flock v0.12.1 // indirect
95100
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect
96101
github.com/golang-sql/sqlexp v0.1.0 // indirect
97102
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
98103
github.com/golang/snappy v0.0.4 // indirect
99104
github.com/google/go-querystring v1.1.0 // indirect
105+
github.com/gorilla/websocket v1.5.3 // indirect
100106
github.com/hashicorp/errwrap v1.1.0 // indirect
101107
github.com/hashicorp/go-multierror v1.1.1 // indirect
102108
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
@@ -111,10 +117,11 @@ require (
111117
github.com/jmespath/go-jmespath v0.4.0 // indirect
112118
github.com/josharian/intern v1.0.0 // indirect
113119
github.com/json-iterator/go v1.1.12 // indirect
114-
github.com/klauspost/compress v1.17.11 // indirect
120+
github.com/klauspost/compress v1.18.0 // indirect
115121
github.com/klauspost/cpuid/v2 v2.2.9 // indirect
116122
github.com/klauspost/pgzip v1.2.6 // indirect
117123
github.com/leodido/go-urn v1.4.0 // indirect
124+
github.com/localrivet/wilduri v0.0.0-20250504021349-6ce732e97cca // indirect
118125
github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 // indirect
119126
github.com/magiconair/properties v1.8.9 // indirect
120127
github.com/mailru/easyjson v0.9.0 // indirect
@@ -128,6 +135,9 @@ require (
128135
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
129136
github.com/montanaflynn/stats v0.7.1 // indirect
130137
github.com/mozillazg/go-httpheader v0.4.0 // indirect
138+
github.com/nats-io/nats.go v1.42.0 // indirect
139+
github.com/nats-io/nkeys v0.4.11 // indirect
140+
github.com/nats-io/nuid v1.0.1 // indirect
131141
github.com/ncruces/go-strftime v0.1.9 // indirect
132142
github.com/nwaples/rardecode/v2 v2.1.0 // indirect
133143
github.com/otiai10/mint v1.6.3 // indirect
@@ -172,11 +182,13 @@ require (
172182
golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8 // indirect
173183
golang.org/x/image v0.23.0 // indirect
174184
golang.org/x/mod v0.22.0 // indirect
175-
golang.org/x/net v0.34.0 // indirect
176-
golang.org/x/sys v0.29.0 // indirect
185+
golang.org/x/net v0.35.0 // indirect
186+
golang.org/x/sys v0.32.0 // indirect
177187
golang.org/x/time v0.9.0 // indirect
178188
golang.org/x/tools v0.29.0 // indirect
179-
google.golang.org/protobuf v1.36.3 // indirect
189+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250218202821-56aae31c358a // indirect
190+
google.golang.org/grpc v1.72.1 // indirect
191+
google.golang.org/protobuf v1.36.6 // indirect
180192
gopkg.in/ini.v1 v1.67.0 // indirect
181193
gopkg.in/yaml.v3 v3.0.1 // indirect
182194
gorm.io/hints v1.1.2 // indirect

0 commit comments

Comments
 (0)