From 3fd09754278c19ae85acf1e35ab2fd0ece8c2171 Mon Sep 17 00:00:00 2001 From: hoteas <925970985@qq.com> Date: Fri, 30 Jan 2026 22:17:53 +0800 Subject: [PATCH] =?UTF-8?q?refactor(log):=20=E4=BC=98=E5=8C=96=E8=B0=83?= =?UTF-8?q?=E7=94=A8=E6=A0=88=E6=9F=A5=E6=89=BE=E9=80=BB=E8=BE=91=E4=BB=A5?= =?UTF-8?q?=E6=8F=90=E9=AB=98=E5=87=86=E7=A1=AE=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 注释掉批量缓存操作测试的调用,避免不必要的执行 - 改进 findCaller 函数,增加对 application.go 的优先记录逻辑 - 确保返回的调用者信息优先考虑应用层代码,提升日志信息的准确性 - 增强框架文件的过滤机制,确保更清晰的调用栈信息 --- example/main.go | 2 +- log/logrus.go | 29 +++++++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/example/main.go b/example/main.go index 75c59d1..9b7d943 100644 --- a/example/main.go +++ b/example/main.go @@ -99,7 +99,7 @@ func main() { "cache-compat": func(that *Context) { that.Display(0, testCacheCompatible(that)) }, // 批量缓存操作测试 "cache-batch": func(that *Context) { - TestBatchCacheOperations(that.Application) + //TestBatchCacheOperations(that.Application) that.Display(0, Map{"message": "批量缓存测试完成,请查看控制台输出和日志文件"}) }, }, diff --git a/log/logrus.go b/log/logrus.go index 580a1c0..1a31eea 100644 --- a/log/logrus.go +++ b/log/logrus.go @@ -141,8 +141,13 @@ func isHoTimeFrameworkFile(file string) bool { // 对caller进行递归查询, 直到找到非框架层产生的第一个调用. // 遍历调用栈,跳过框架层文件,找到应用层代码 // 使用层数限制确保不会误过滤应用层同名目录 +// 返回优先级:应用层代码 > application.go > 其他框架文件 func findCaller(skip int) string { frameworkCount := 0 // 连续框架层计数 + var lastFrameworkFile string + var lastFrameworkLine int + var applicationFile string // 优先记录 application.go 位置 + var applicationLine int // 遍历调用栈,找到第一个非框架文件 for i := 0; i < 20; i++ { @@ -151,8 +156,17 @@ func findCaller(skip int) string { break } - if isHoTimeFrameworkFile(file) { + isFramework := isHoTimeFrameworkFile(file) + + if isFramework { frameworkCount++ + lastFrameworkFile = file + lastFrameworkLine = line + // 优先记录 application.go 位置(HoTime 框架入口) + if strings.Contains(file, "application.go") { + applicationFile = file + applicationLine = line + } // 层数限制:如果已经跳过太多层,停止跳过 if frameworkCount >= maxFrameworkDepth { return fmt.Sprintf("%s:%d", file, line) @@ -164,7 +178,18 @@ func findCaller(skip int) string { return fmt.Sprintf("%s:%d", file, line) } - // 如果找不到应用层,返回最初的调用者 + // 如果找不到应用层,返回最后记录的框架文件位置 + // 优先级:application.go > 其他框架文件 > 第一个调用者 + // 确保不会返回 logrus 或 runtime 等三方组件位置 + if applicationFile != "" { + return fmt.Sprintf("%s:%d", applicationFile, applicationLine) + } + + if lastFrameworkFile != "" { + return fmt.Sprintf("%s:%d", lastFrameworkFile, lastFrameworkLine) + } + + // 最后的回退:返回第一个调用者 file, line := getCaller(skip) return fmt.Sprintf("%s:%d", file, line) }