service/log.go

224 lines
6.2 KiB
Go

package service
import (
"apigo.cc/go/cast"
"apigo.cc/go/log"
)
type RequestLog struct {
log.BaseLog
ServerId string `log:"pos:6,hide:true"`
App string `log:"pos:7,color:cyan,keyname:App"`
Node string `log:"pos:8,color:gray,attachBefore:true"`
FromApp string `log:"pos:9,color:cyan,keyname:From"`
FromNode string `log:"pos:10,color:gray,attachBefore:true"`
ClientIp string `log:"pos:11,withoutkey:true"`
ClientAppName string `log:"pos:12,attachBefore:true,keyname:Client"`
ClientAppVersion string `log:"pos:13,attachBefore:true"`
UserId string `log:"pos:14,color:magenta,keyname:User"`
DeviceId string `log:"pos:15,color:gray,keyname:Device"`
SessionId string `log:"pos:16,keyname:Session"`
Host string `log:"pos:17,color:gray,withoutkey:true"`
Method string `log:"pos:18,color:gray,withoutkey:true"`
Path string `log:"pos:19,color:cyan,withoutkey:true"`
Scheme string `log:"pos:20,color:gray,withoutkey:true"`
Proto string `log:"pos:21,color:gray,withoutkey:true"`
AuthLevel int `log:"pos:22,color:green"`
Priority int `log:"pos:23,hide:true"`
RequestData any `log:"pos:24,color:cyan,keyname:Request"`
RequestHeaders map[string]string `log:"pos:25,color:cyan,keyname:Headers"`
UsedTime float32 `log:"pos:26,color:green,precision:6"`
ResponseCode int `log:"pos:27,color:magenta,keyname:Status"`
ResponseDataLength uint `log:"pos:28,color:magenta,keyname:ContentLength"`
ResponseData any `log:"pos:29,color:magenta,keyname:Response"`
ResponseHeaders map[string]string `log:"pos:30,color:magenta,keyname:Headers"`
}
func (l *RequestLog) Reset() {
l.BaseLog.Reset()
l.ServerId = ""
l.App = ""
l.Node = ""
l.ClientIp = ""
l.FromApp = ""
l.FromNode = ""
l.UserId = ""
l.DeviceId = ""
l.ClientAppName = ""
l.ClientAppVersion = ""
l.SessionId = ""
l.Host = ""
l.Scheme = ""
l.Proto = ""
l.AuthLevel = 0
l.Priority = 0
l.Method = ""
l.Path = ""
if l.RequestHeaders == nil {
l.RequestHeaders = make(map[string]string, 8)
} else {
clear(l.RequestHeaders)
}
l.RequestData = nil
l.UsedTime = 0
l.ResponseCode = 0
if l.ResponseHeaders == nil {
l.ResponseHeaders = make(map[string]string, 8)
} else {
clear(l.ResponseHeaders)
}
l.ResponseDataLength = 0
l.ResponseData = nil
}
// RequestLog 调用封装
func logRequest(
logger *log.Logger,
method, path, host, scheme, proto string,
clientIp, serverId, app, node string,
fromApp, fromNode string,
userId, deviceId, sessionId, requestId string,
clientAppName, clientAppVersion string,
authLevel, priority int,
reqHeaders map[string]string,
reqData map[string]any,
responseCode int,
usedTime float32,
respHeaders map[string]string,
responseData string,
responseDataLength uint,
extra ...any,
) {
if !logger.CheckLevel(log.INFO) {
return
}
entry := log.GetEntry[RequestLog]()
logger.FillBase(entry.GetBaseLog(), log.LogTypeRequest)
entry.Method = method
entry.Path = path
entry.Host = host
entry.Scheme = scheme
entry.Proto = proto
entry.ClientIp = clientIp
entry.ServerId = serverId
entry.App = app
entry.Node = node
entry.FromApp = fromApp
entry.FromNode = fromNode
entry.UserId = userId
entry.DeviceId = deviceId
entry.SessionId = sessionId
entry.ClientAppName = clientAppName
entry.ClientAppVersion = clientAppVersion
entry.AuthLevel = authLevel
entry.Priority = priority
entry.RequestHeaders = reqHeaders
entry.RequestData = reqData
entry.ResponseCode = responseCode
entry.UsedTime = usedTime
entry.ResponseHeaders = respHeaders
entry.ResponseData = responseData
entry.ResponseDataLength = responseDataLength
if len(extra) > 0 {
cast.FillMap(&entry.Extra, extra)
}
logger.Log(entry)
}
type TaskLog struct {
log.BaseLog
Task string `log:"pos:6"`
UsedTime float32 `log:"pos:7"`
Success bool `log:"pos:8"`
Message string `log:"pos:9"`
}
func (l *TaskLog) Reset() {
l.BaseLog.Reset()
l.Task = ""
l.UsedTime = 0
l.Success = false
l.Message = ""
}
type MonitorLog struct {
log.BaseLog
Target string `log:"pos:6"`
Status int `log:"pos:7"`
Message string `log:"pos:8"`
}
func (l *MonitorLog) Reset() {
l.BaseLog.Reset()
l.Target = ""
l.Status = 0
l.Message = ""
}
type StatisticLog struct {
log.BaseLog
Category string `log:"pos:6"`
Item string `log:"pos:7"`
Value float64 `log:"pos:8"`
}
func (l *StatisticLog) Reset() {
l.BaseLog.Reset()
l.Category = ""
l.Item = ""
l.Value = 0
}
func logTask(logger *log.Logger, taskName string, usedTime float32, success bool, message string, extra ...any) {
if logger.CheckLevel(log.INFO) {
entry := log.GetEntry[TaskLog]()
logger.FillBase(entry.GetBaseLog(), log.LogTypeTask)
entry.Task = taskName
entry.UsedTime = usedTime
entry.Success = success
entry.Message = message
if len(extra) > 0 {
cast.FillMap(&entry.Extra, extra)
}
logger.Log(entry)
}
}
func logMonitor(logger *log.Logger, target string, status int, message string, extra ...any) {
if logger.CheckLevel(log.INFO) {
entry := log.GetEntry[MonitorLog]()
logger.FillBase(entry.GetBaseLog(), log.LogTypeMonitor)
entry.Target = target
entry.Status = status
entry.Message = message
if len(extra) > 0 {
cast.FillMap(&entry.Extra, extra)
}
logger.Log(entry)
}
}
func logStatistic(logger *log.Logger, category, item string, value float64, extra ...any) {
if logger.CheckLevel(log.INFO) {
entry := log.GetEntry[StatisticLog]()
logger.FillBase(entry.GetBaseLog(), log.LogTypeStatistic)
entry.Category = category
entry.Item = item
entry.Value = value
if len(extra) > 0 {
cast.FillMap(&entry.Extra, extra)
}
logger.Log(entry)
}
}
func init() {
log.RegisterType(log.LogTypeRequest, &RequestLog{})
log.RegisterType(log.LogTypeTask, &TaskLog{})
log.RegisterType(log.LogTypeMonitor, &MonitorLog{})
log.RegisterType(log.LogTypeStatistic, &StatisticLog{})
}