temp version for new plan

This commit is contained in:
AI Engineer 2026-05-05 20:35:15 +08:00
parent a720cfb63b
commit b2f91d37be
4 changed files with 159 additions and 73 deletions

View File

@ -1,11 +1,6 @@
# Changelog # Changelog
## [1.1.3] - 2026-05-05 ## [1.1.2] - 2026-05-05
- **自动化增强**:
- 引入 `StackTraceable` 接口,`Log(entry)` 现在支持自动补全调用栈(当字段为空时)。
- `WarningLog``ErrorLog` 默认集成自动补全契约,外部业务无需再手动调用堆栈捕获函数。
- **架构收敛**: 撤销 `GetCallStacks` 导出,将堆栈逻辑完全封装在基础设施层。
- **清理**: 移除 `extra.go` 中过时的示例注释。
- **架构解耦**: - **架构解耦**:
- 正式移除 `log` 包对数据库日志(`DB` 方法及 `DBLog` 结构)的内置支持,推动“日志格式随业务走”的架构对齐。 - 正式移除 `log` 包对数据库日志(`DB` 方法及 `DBLog` 结构)的内置支持,推动“日志格式随业务走”的架构对齐。
- 导出 `GetCallStacks` 方法,支持外部包捕获符合截断配置的调用栈。 - 导出 `GetCallStacks` 方法,支持外部包捕获符合截断配置的调用栈。

200
extra.go
View File

@ -1,53 +1,157 @@
package log package log
type RequestLog struct { // import (
BaseLog // "apigo.cc/go/cast"
ServerId string // )
App string
Node string
ClientIp string
FromApp string
FromNode string
UserId string
DeviceId string
ClientAppName string
ClientAppVersion string
SessionId string
RequestId string
Host string
Scheme string
Proto string
AuthLevel int
Priority int
Method string
Path string
RequestHeaders map[string]string
RequestData map[string]any
UsedTime float32
ResponseCode int
ResponseHeaders map[string]string
ResponseDataLength uint
ResponseData string
}
type TaskLog struct { // type RequestLog struct {
BaseLog // BaseLog
Task string // ServerId string
UsedTime float32 // App string
Success bool // Node string
Message string // ClientIp string
} // FromApp string
// FromNode string
// UserId string
// DeviceId string
// ClientAppName string
// ClientAppVersion string
// SessionId string
// RequestId string
// Host string
// Scheme string
// Proto string
// AuthLevel int
// Priority int
// Method string
// Path string
// RequestHeaders map[string]string
// RequestData map[string]any
// UsedTime float32
// ResponseCode int
// ResponseHeaders map[string]string
// ResponseDataLength uint
// ResponseData string
// }
type MonitorLog struct { // func (logger *Logger) Request(
BaseLog // method, path, host, scheme, proto string,
Target string // clientIp, serverId, app, node string,
Status int // fromApp, fromNode string,
Message 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(INFO) {
// return
// }
type StatisticLog struct { // entry := GetEntry[RequestLog]()
BaseLog // logger.fillBase(entry, LogTypeRequest)
Category string
Item string // // 暴力平铺赋值,性能极高
Value float64 // 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.RequestId = requestId
// 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 {
// BaseLog
// Task string
// UsedTime float32
// Success bool
// Message string
// }
// type MonitorLog struct {
// BaseLog
// Target string
// Status int
// Message string
// }
// type StatisticLog struct {
// BaseLog
// Category string
// Item string
// Value float64
// }
// func (logger *Logger) Task(taskName string, usedTime float32, success bool, message string, extra ...any) {
// if logger.CheckLevel(INFO) {
// entry := GetEntry[TaskLog]()
// logger.fillBase(entry, 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 (logger *Logger) Monitor(target string, status int, message string, extra ...any) {
// if logger.CheckLevel(INFO) {
// entry := GetEntry[MonitorLog]()
// logger.fillBase(entry, LogTypeMonitor)
// entry.Target = target
// entry.Status = status
// entry.Message = message
// if len(extra) > 0 {
// cast.FillMap(&entry.Extra, extra)
// }
// logger.Log(entry)
// }
// }
// func (logger *Logger) Statistic(category, item string, value float64, extra ...any) {
// if logger.CheckLevel(INFO) {
// entry := GetEntry[StatisticLog]()
// logger.fillBase(entry, LogTypeStatistic)
// entry.Category = category
// entry.Item = item
// entry.Value = value
// if len(extra) > 0 {
// cast.FillMap(&entry.Extra, extra)
// }
// logger.Log(entry)
// }
// }

View File

@ -166,14 +166,6 @@ func (logger *Logger) Log(entry LogEntry) {
if entry.GetBaseLog().LogTime == 0 { if entry.GetBaseLog().LogTime == 0 {
logger.fillBase(entry, "") logger.fillBase(entry, "")
} }
// 自动补全调用栈
if st, ok := entry.(StackTraceable); ok {
if len(st.GetCallStacks()) == 0 {
st.SetCallStacks(getCallStacks(logger.truncations))
}
}
logger.asyncWrite(entry) logger.asyncWrite(entry)
} }
@ -225,6 +217,10 @@ func (logger *Logger) fillBase(entry LogEntry, logType string) {
base.ServerIp = serverIp base.ServerIp = serverIp
} }
func (logger *Logger) GetCallStacks() []string {
return getCallStacks(logger.truncations)
}
func (logger *Logger) Debug(message string, extra ...any) { func (logger *Logger) Debug(message string, extra ...any) {
if logger.CheckLevel(DEBUG) { if logger.CheckLevel(DEBUG) {
entry := GetEntry[DebugLog]() entry := GetEntry[DebugLog]()
@ -254,6 +250,7 @@ func (logger *Logger) Warning(message string, extra ...any) {
entry := GetEntry[WarningLog]() entry := GetEntry[WarningLog]()
logger.fillBase(entry, LogTypeWarning) logger.fillBase(entry, LogTypeWarning)
entry.Warning = message entry.Warning = message
entry.CallStacks = getCallStacks(logger.truncations)
if len(extra) > 0 { if len(extra) > 0 {
cast.FillMap(&entry.Extra, extra) cast.FillMap(&entry.Extra, extra)
} }
@ -266,6 +263,7 @@ func (logger *Logger) Error(message string, extra ...any) {
entry := GetEntry[ErrorLog]() entry := GetEntry[ErrorLog]()
logger.fillBase(entry, LogTypeError) logger.fillBase(entry, LogTypeError)
entry.Error = message entry.Error = message
entry.CallStacks = getCallStacks(logger.truncations)
if len(extra) > 0 { if len(extra) > 0 {
cast.FillMap(&entry.Extra, extra) cast.FillMap(&entry.Extra, extra)
} }

View File

@ -46,11 +46,6 @@ func (b *BaseLog) GetBaseLog() *BaseLog {
return b return b
} }
type StackTraceable interface {
GetCallStacks() []string
SetCallStacks([]string)
}
type DebugLog struct { type DebugLog struct {
BaseLog BaseLog
Debug string Debug string
@ -67,14 +62,8 @@ type WarningLog struct {
CallStacks []string CallStacks []string
} }
func (l *WarningLog) GetCallStacks() []string { return l.CallStacks }
func (l *WarningLog) SetCallStacks(s []string) { l.CallStacks = s }
type ErrorLog struct { type ErrorLog struct {
BaseLog BaseLog
Error string Error string
CallStacks []string CallStacks []string
} }
func (l *ErrorLog) GetCallStacks() []string { return l.CallStacks }
func (l *ErrorLog) SetCallStacks(s []string) { l.CallStacks = s }