From ad586a992f0abde57234676f452822b78a6b3778 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Mon, 23 Oct 2023 18:01:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=20=E8=B0=83=E5=BA=A6=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=98=AF=E5=90=A6=E8=BF=9B=E8=A1=8C=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/upgrade/20231023.sql | 13 ++ src/framework/cron/log.go | 120 ++++++++++-------- src/modules/monitor/model/sys_job.go | 2 + .../monitor/repository/sys_job.impl.go | 9 +- 4 files changed, 93 insertions(+), 51 deletions(-) create mode 100644 database/upgrade/20231023.sql diff --git a/database/upgrade/20231023.sql b/database/upgrade/20231023.sql new file mode 100644 index 00000000..4462a309 --- /dev/null +++ b/database/upgrade/20231023.sql @@ -0,0 +1,13 @@ + +-- 调度任务记录日志字典 +insert into `omc_db`.sys_dict_type values(null, '任务日志记录', 'sys_job_save_log', '1', 'maskAdmin', REPLACE(unix_timestamp(now(3)),'.',''), '', 0, '任务日志记录列表'); + + +insert into `omc_db`.sys_dict_data values(null, 1, '不记录', '0', 'sys_job_save_log', '', '', '1', 'maskAdmin', REPLACE(unix_timestamp(now(3)),'.',''), '', 0, '不记录日志'); +insert into `omc_db`.sys_dict_data values(null, 2, '记录', '1', 'sys_job_save_log', '', '', '1', 'maskAdmin', REPLACE(unix_timestamp(now(3)),'.',''), '', 0, '记录日志'); + +-- 调度任务记录日志字段 +ALTER TABLE `omc_db`.`sys_job` +ADD COLUMN `save_log` varchar(1) NULL DEFAULT '0' COMMENT '是否记录任务日志(0不记录 1记录)' AFTER `status`; + +UPDATE `omc_db`.`sys_job` SET `save_log` = '1'; diff --git a/src/framework/cron/log.go b/src/framework/cron/log.go index 0657ab4d..3e6b698c 100644 --- a/src/framework/cron/log.go +++ b/src/framework/cron/log.go @@ -31,33 +31,16 @@ func (s cronlog) Error(err error, msg string, keysAndValues ...any) { // 任务对象 job := keysAndValues[0].(*QueueJob) - // 结果信息序列化字符串 - jsonByte, _ := json.Marshal(map[string]any{ - "name": "failed", - "message": err.Error(), - }) - jobMsg := string(jsonByte) - if len(jobMsg) > 500 { - jobMsg = jobMsg[:500] - } - - // 读取任务信息创建日志对象 + // 读取任务信息进行保存日志 if data, ok := job.Data.(JobData); ok { - duration := time.Since(time.UnixMilli(job.Timestamp)) - sysJob := data.SysJob - if sysJob.JobID == job.Opts.JobId { - sysJobLog := model.SysJobLog{ - JobName: sysJob.JobName, - JobGroup: sysJob.JobGroup, - InvokeTarget: sysJob.InvokeTarget, - TargetParams: sysJob.TargetParams, - Status: common.STATUS_NO, - JobMsg: jobMsg, - CostTime: duration.Milliseconds(), - } - // 插入数据 - repository.NewSysJobLogImpl.InsertJobLog(sysJobLog) + // 日志数据 + jobLog := jobLogData{ + JobID: job.Opts.JobId, + Timestamp: job.Timestamp, + SysJob: data.SysJob, + Result: err.Error(), } + jobLog.SaveLog(common.STATUS_NO) } } } @@ -72,37 +55,74 @@ func (s cronlog) Completed(result any, msg string, keysAndValues ...any) { // 任务对象 job := keysAndValues[0].(*QueueJob) - // 结果信息序列化字符串 - jsonByte, _ := json.Marshal(map[string]any{ - "name": "completed", - "message": result, - }) - jobMsg := string(jsonByte) - if len(jobMsg) > 500 { - jobMsg = jobMsg[:500] - } - - // 读取任务信息创建日志对象 + // 读取任务信息进行保存日志 if data, ok := job.Data.(JobData); ok { - duration := time.Since(time.UnixMilli(job.Timestamp)) - sysJob := data.SysJob - if sysJob.JobID == job.Opts.JobId { - sysJobLog := model.SysJobLog{ - JobName: sysJob.JobName, - JobGroup: sysJob.JobGroup, - InvokeTarget: sysJob.InvokeTarget, - TargetParams: sysJob.TargetParams, - Status: common.STATUS_YES, - JobMsg: jobMsg, - CostTime: duration.Milliseconds(), - } - // 插入数据 - repository.NewSysJobLogImpl.InsertJobLog(sysJobLog) + // 日志数据 + jobLog := jobLogData{ + JobID: job.Opts.JobId, + Timestamp: job.Timestamp, + SysJob: data.SysJob, + Result: result, } + jobLog.SaveLog(common.STATUS_YES) } } } +// jobLogData 日志记录数据 +type jobLogData struct { + JobID string + Timestamp int64 + SysJob model.SysJob + Result any +} + +// SaveLog 日志记录保存 +func (jl *jobLogData) SaveLog(status string) { + // 读取任务信息 + sysJob := jl.SysJob + + // 任务ID与任务信息ID不相同 + if jl.JobID == "" || jl.JobID != sysJob.JobID { + return + } + + // 任务日志不需要记录 + if sysJob.SaveLog == "" || sysJob.SaveLog == common.STATUS_NO { + return + } + + // 结果信息key的Name + resultNmae := "failed" + if status == common.STATUS_YES { + resultNmae = "completed" + } + + // 结果信息序列化字符串 + jsonByte, _ := json.Marshal(map[string]any{ + "name": resultNmae, + "message": jl.Result, + }) + jobMsg := string(jsonByte) + if len(jobMsg) > 500 { + jobMsg = jobMsg[:500] + } + + // 创建日志对象 + duration := time.Since(time.UnixMilli(jl.Timestamp)) + sysJobLog := model.SysJobLog{ + JobName: sysJob.JobName, + JobGroup: sysJob.JobGroup, + InvokeTarget: sysJob.InvokeTarget, + TargetParams: sysJob.TargetParams, + Status: status, + JobMsg: jobMsg, + CostTime: duration.Milliseconds(), + } + // 插入数据 + repository.NewSysJobLogImpl.InsertJobLog(sysJobLog) +} + // JobData 调度任务日志收集结构体,执行任务时传入的接收参数 type JobData struct { // 触发执行cron重复多次 diff --git a/src/modules/monitor/model/sys_job.go b/src/modules/monitor/model/sys_job.go index 598f1293..a7f910f4 100644 --- a/src/modules/monitor/model/sys_job.go +++ b/src/modules/monitor/model/sys_job.go @@ -20,6 +20,8 @@ type SysJob struct { Concurrent string `json:"concurrent"` // 任务状态(0暂停 1正常) Status string `json:"status"` + // 是否记录任务日志 + SaveLog string `json:"saveLog"` // 创建者 CreateBy string `json:"createBy"` // 创建时间 diff --git a/src/modules/monitor/repository/sys_job.impl.go b/src/modules/monitor/repository/sys_job.impl.go index 12eceb26..19ab0594 100644 --- a/src/modules/monitor/repository/sys_job.impl.go +++ b/src/modules/monitor/repository/sys_job.impl.go @@ -15,7 +15,7 @@ import ( // 实例化数据层 SysJobImpl 结构体 var NewSysJobImpl = &SysJobImpl{ selectSql: `select job_id, job_name, job_group, invoke_target, target_params, cron_expression, - misfire_policy, concurrent, status, create_by, create_time, remark from sys_job`, + misfire_policy, concurrent, status, save_log, create_by, create_time, remark from sys_job`, resultMap: map[string]string{ "job_id": "JobID", @@ -27,6 +27,7 @@ var NewSysJobImpl = &SysJobImpl{ "misfire_policy": "MisfirePolicy", "concurrent": "Concurrent", "status": "Status", + "save_log": "SaveLog", "create_by": "CreateBy", "create_time": "CreateTime", "update_by": "UpdateBy", @@ -245,6 +246,9 @@ func (r *SysJobImpl) InsertJob(sysJob model.SysJob) string { if sysJob.Status != "" { params["status"] = sysJob.Status } + if sysJob.SaveLog != "" { + params["save_log"] = sysJob.SaveLog + } if sysJob.Remark != "" { params["remark"] = sysJob.Remark } @@ -308,6 +312,9 @@ func (r *SysJobImpl) UpdateJob(sysJob model.SysJob) int64 { if sysJob.Status != "" { params["status"] = sysJob.Status } + if sysJob.SaveLog != "" { + params["save_log"] = sysJob.SaveLog + } if sysJob.Remark != "" { params["remark"] = sysJob.Remark }