Files
be.ems/src/framework/cron/cron_log.go

130 lines
3.1 KiB
Go

package cron
import (
"encoding/json"
"errors"
"time"
"be.ems/src/framework/constants"
monitorModel "be.ems/src/modules/monitor/model"
monitorRepository "be.ems/src/modules/monitor/repository"
)
// cronLog 实例任务执行日志收集
var cronLog = clog{}
// clog 任务执行日志收集
type clog struct{}
// Info 任务普通信息收集
func (clog) Info(msg string, keysAndValues ...any) {
//log.Printf("Info msg: %v ====> kv: %v", msg, keysAndValues)
}
// Error 任务异常错误收集
func (clog) Error(err error, msg string, keysAndValues ...any) {
//log.Printf("Error: %v -> msg: %v ====> kv: %v", err, msg, keysAndValues)
//log.Printf("k0: %v", keysAndValues[0].(QueueJob))
// 指定的错误收集
if msg == "failed" {
// 任务对象
job := keysAndValues[0].(QueueJob)
// 读取任务信息进行保存日志
if data, ok := job.Data.(JobData); ok {
// 日志数据
jobLog := jobLogData{
Timestamp: job.Timestamp,
Data: data,
Result: err.Error(),
}
jobLog.SaveLog(constants.STATUS_NO)
}
}
}
// Completed 任务完成return的结果收集
func (clog) Completed(result any, msg string, keysAndValues ...any) {
//log.Printf("Completed: %v -> msg: %v ====> kv: %v", result, msg, keysAndValues)
//log.Printf("k0: %v", keysAndValues[0].(QueueJob))
// 指定的完成收集
if msg == "completed" {
// 任务对象
job := keysAndValues[0].(QueueJob)
// 读取任务信息进行保存日志
if data, ok := job.Data.(JobData); ok {
// 日志数据
jobLog := jobLogData{
Timestamp: job.Timestamp,
Data: data,
Result: result,
}
jobLog.SaveLog(constants.STATUS_YES)
}
}
}
// jobLogData 日志记录数据
type jobLogData struct {
Timestamp int64
Data JobData
Result any
}
// SaveLog 日志记录保存
func (jl *jobLogData) SaveLog(statusFlag string) {
// 读取任务信息
sysJob := jl.Data.SysJob
// 任务日志不需要记录
if sysJob.SaveLog == "" || sysJob.SaveLog == constants.STATUS_NO {
return
}
// 结果信息key的Name
resultName := "failed"
if statusFlag == constants.STATUS_YES {
resultName = "completed"
}
// 结果信息序列化字符串
jsonByte, _ := json.Marshal(map[string]any{
"cron": jl.Data.Repeat,
"name": resultName,
"message": jl.Result,
})
jobMsg := string(jsonByte)
if len(jobMsg) > 2000 {
jobMsg = jobMsg[:2000]
}
// 创建日志对象
duration := time.Since(time.UnixMilli(jl.Timestamp))
sysJobLog := monitorModel.SysJobLog{
JobName: sysJob.JobName,
JobGroup: sysJob.JobGroup,
InvokeTarget: sysJob.InvokeTarget,
TargetParams: sysJob.TargetParams,
StatusFlag: statusFlag,
JobMsg: jobMsg,
CostTime: duration.Milliseconds(),
CreateTime: time.Now().UnixMilli(),
}
// 插入数据
monitorRepository.NewSysJobLog.Insert(sysJobLog)
}
// JobData 调度任务日志收集结构体,执行任务时传入的接收参数
type JobData struct {
// 触发执行cron重复多次
Repeat bool
// 定时任务调度表记录信息
SysJob monitorModel.SysJob
}
// ErrTaskRunning 任务正在运行错误
var ErrTaskRunning = errors.New("task is running")