0

0

如何在Golang中记录错误日志_Golang错误日志记录方式

P粉602998670

P粉602998670

发布时间:2026-01-12 14:53:02

|

984人浏览过

|

来源于php中文网

原创

log.Printf 不显示调用栈因不自动捕获堆栈,需用 runtime.Caller 或 zap.Error();zap.Error() 支持错误展开与 nil 安全,优于直接 err.Error();log.Fatal 会终止进程,HTTP handler 中禁用;敏感字段必须脱敏,日志重在可追溯而非全量输出。

如何在golang中记录错误日志_golang错误日志记录方式

log.Printf 记录错误时,为什么看不到调用

因为 log.Printf 只做格式化输出,不自动捕获堆栈。你传入的 err 本身(比如 errors.New("xxx"))通常不含调用信息。要看到哪一行出的错,得手动加 runtime.Caller,或者换支持 trace 的日志库。

临时调试可以这样补:

import "runtime"

func logError(err error) {
    _, file, line, _ := runtime.Caller(1)
    log.Printf("ERROR [%s:%d] %v", file, line, err)
}
  • 别在生产环境高频调用 runtime.Caller,有性能开销
  • Caller(1) 表示跳过当前函数,取调用方的位置
  • 标准库 log 没有内置 error 字段结构化能力,err.Error() 是唯一能安全取的字符串

zap 记录错误时,zap.Error() 和直接 zap.String("error", err.Error()) 有什么区别

zap.Error() 不只是把 err.Error() 存成字符串——它会尝试展开实现了 fmt.FormatterstackTracer 接口的错误(比如 github.com/pkg/errors 包 wrap 的错误),并保留原始类型信息,方便后期结构化过滤或高亮显示。

推荐写法:

立即学习go语言免费学习笔记(深入)”;

Asp.net企业网站管理系统2.0 (精美实用)
Asp.net企业网站管理系统2.0 (精美实用)

漂亮的企业网站。NET2.0出来了, 本次升级修改如下: 1、优化了3层结构。 2、优化了后台管理代码,增强了安全性能。 3、增加了系统名称及关键字管理。 4、增加了系统错误日志记录,自动生成Systemlog.log日志文件。 备注:本系统采用ASP.NET 2.O+ACCESS开发,请调试的朋友安装.NET2.0运行环境! 网站内容 网站栏目包括 首页|企业简介|新闻中心|产品展示|公司展示|

下载
logger.Error("db query failed",
    zap.String("query", sql),
    zap.Error(err), // ← 这里传 err 本体,不是 err.Error()
    zap.String("user_id", userID),
)
  • 如果 errnilzap.Error() 会自动写成 "error": null,不会 panic
  • 自己用 zap.String("error", err.Error()) 会丢失堆栈、丢掉类型语义,且 errnil 时会 panic
  • 注意:原生 errors.Newfmt.Errorf(Go 1.13+)不带堆栈,需用 fmt.Errorf("xxx: %w", err) 配合 errors.Is/As 才能链式追踪

为什么 log.Fatal 不适合记录 HTTP handler 中的错误?

log.Fatal 底层调用 os.Exit(1),会导致整个进程退出。在 HTTP server 里一旦某个请求出错就 kill 掉服务,显然不可接受。

  • handler 中该用 log.Printf 或结构化 logger 记录,然后返回 http.Error 或自定义响应
  • log.Panic 同样危险:触发 panic 后若没被 recover,照样崩进程
  • 真正该用 log.Fatal 的场景极少,一般是 main 函数里初始化失败(如无法监听端口、加载配置失败)

错误日志中要不要打印敏感字段(如密码、token、用户手机号)?

不要。哪怕是在 debug 环境,也不该让明文敏感数据落到磁盘日志文件里。zap 提供 zap.String("password", "[redacted]") 这种显式脱敏,但更稳妥的是从源头控制:

  • 记录前用 strings.ReplaceAll 或正则擦除已知敏感键值(如 "auth_token""card_number"
  • HTTP 请求体、数据库查询参数等,统一走中间件或 wrapper 做字段过滤,而不是靠日志函数临时判断
  • 使用 zap.Object + 自定义 LogObjectMarshaler 接口,对 struct 字段做选择性序列化

日志不是 dump,是线索。留够定位信息就行,多一条密码反而增加泄露风险。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

178

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

226

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

337

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

208

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

388

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

194

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

189

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

192

2025.06.17

Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

10

2026.01.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 2.6万人学习

Git版本控制工具
Git版本控制工具

共8课时 | 1.5万人学习

Git中文开发手册
Git中文开发手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号