如何使用Golang log记录不同级别日志_Golang log Println与Fatal示例


Go 标准库 log 不支持日志级别,仅提供 Print/Fatal/Panic 等函数,无 Info/Warn/Error 分级;需用第三方库(如 logrus、zap)或自行封装前缀式 Logger。

Go 标准库 log 本身不支持日志级别

这是最容易踩的坑:Go 原生 log 包没有 InfoWarnError 等分级接口。它只提供 PrintPrintfPrintlnFatalFatalfPanicPanicf 这几组函数,其中只有 FatalPanic 会终止程序,其余都只是输出——它们在语义上并无级别区分。

如果你看到别人代码里写了 log.Info(...),那一定是用了第三方库(比如 logruszapzerolog),不是标准库。

  • log.Println():输出后换行,不退出进程
  • log.Fatal():等价于 log.Println() + os.Exit(1),输出后立即终止程序
  • log.Panic():等价于 log.Println() + panic(...),触发 panic,可被 recover 捕获(但一般不这么用)

如何模拟日志级别(轻量方案)

如果不想引入第三方库,又想区分日志用途,常见做法是封装自己的 Logger 类型,用前缀或不同输出目标来区分:

package main

import (
    "log"
    "os"
)

var (
    InfoLogger  = log.New(os.Stdout, "[INFO] ", log.Ldate|log.Ltime|log.Lshortfile)
    ErrorLogger = log.New(os.Stderr, "[ERROR] ", log.Ldate|log.Ltime|log.Lshortfile)
    FatalLogger = log.New(os.Stderr, "[FATAL] ", log.Ldate|log.Ltime|log.Lshortfile)
)

func main() {
    InfoLogger.Println("服务启动完成")
    ErrorLogger.Printf("数据库连接失败: %v", "timeout")
    FatalLogger.Fatal("配置文件不存在,无法继续")
}

注意:log.New 的第三个参数是 flag,常用组合如 log.Ldate | log.Ltime | log.Lshortfile,能帮你快速定位日志来源;不要漏掉 |,写成逗号会编译失败。

  • InfoLogger 输出到 os.Stdout,方便管道处理或重定向到文件
  • ErrorLoggerFatalLogger 输出到 os.Stderr,符合 Unix 习惯,也便于分离错误流
  • FatalLogger.Fatal() 仍会调用 os.Exit(1),不可恢复

Fatal 不是 “严重错误日志”,而是 “程序必须退出” 的信号

很多人误以为 log.Fatal 是用来记录“高危错误”的,其实它核心语义是“这个错误发生后,程序已无法安全继续运行”。比如:

  • 监听端口失败且无备选方案
  • 加载必要配置失败(如 JWT 密钥为空)
  • 初始化全局数据库连接池失败

相反,以下情况不该用 Fatal

  • HTTP 请求处理中数据库查询失败(应返回 500 并记录 error 日志)
  • 用户上传文件格式错误(应返回 400)
  • 第三方 API 调用超时(应降级或重试)

滥用 Fatal 会导致服务频繁崩溃,尤其在微服务或容器环境中,可能触发反复重启循环。

真正需要分级时,直接换库比自己造轮子更稳妥

标准库 log 的设计哲学是“足够简单”,它不打算替代专业日志系统。一旦项目规模上升、需要如下能力,就该考虑迁移:

  • 按级别动态控制输出(比如开发环境显示 debug,生产只显示 error)
  • 结构化日志(JSON 输出,字段可被 ELK / Loki 解析)
  • 日志采样、异步写入、滚动切片
  • 上下文透传(ctx 中的 traceID 自动注入每条日志)

推荐起步选择:github.com/sirupsen/logrus(API 清晰,文档全)或 go.uber.org/zap(高性能,适合高吞吐场景)。它们都支持标准库风格的 log.WithFieldlogger.Info 调用,迁移成本低。

别花时间给 log 打补丁加 level 字段——Go 生态里,日志分级这件事,早有成熟解法,而且比你预想的更轻量。


# js  # git  # json  # go  # github  # golang  # 端口  # ai  # unix  # 配置文件  # 开发环境  # 标准库  # print  # 封装  # Error  # printf  # 循环  # 接口  # 切片  # 异步  # 数据库  # http  # elk  # 第三方  # 不支持  # 自己的  # 这是  # 如果你  # 很多人  # 帮你  # 这件事  # 用了  # 不存在 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: php订单日志怎么在swoole写_php协程swoole写订单日志教程【教程】  Python高性能计算项目教程_NumPyCythonGPU并行加速  Windows10如何更改系统字体大小_Win10辅助功能文本缩放设置  如何使用Golang实现容器安全扫描_Golang Docker镜像漏洞检测方法  如何在Golang中使用replace替换模块_指定本地或远程路径  php订单日志权限怎么设_php订单日志文件权限设置技巧【技巧】  Mac如何修复应用程序权限问题_Mac磁盘工具修复权限【教程】  Windows 11登录时提示“用户配置文件服务登录失败”怎么办_Windows 11修复损坏的用户配置文件  如何正确访问 Laravel 模型或对象的属性而非调用不存在的方法  Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】  Win11怎么清理C盘系统日志_Win11清理系统日志文件【步骤】  Win11怎么查看显卡显存_查询Win11显卡详细参数方法【步骤】  MySQL 中使用 IF 和 CASE 实现查询字段条件化显示  Drupal 中 HTML 链接被双重转义导致渲染异常的解决方案  Win11怎么更改默认打开方式_Win11关联文件格式教程【详解】  如何使用Golang读取日志文件_Golang bufio Scanner日志处理示例  Windows10如何更改鼠标图标_Win10鼠标属性指针浏览  Win10系统怎么查看端口状态_Windows10 CMD查看网络连接  如何用正则表达式精确匹配最多含一个换行符的起止片段  Win11怎么查看wifi信号强度_检测Windows 11无线网络质量方法【详解】  MAC怎么在照片中添加水印_MAC自带编辑工具文字水印叠加【方法】  php8.4新语法match怎么用_php8.4match表达式替代switch【方法】  如何在 Go 中判断变量是否为函数类型  如何在 Go 项目开发中正确处理本地包导入与远程模块路径的一致性问题  c++中如何对数组进行排序_c++数组排序算法汇总  Win11怎么更改计算机名_Windows11系统信息重命名设备教程  用Python构建微服务架构实践_FastAPI与Django对比详解  Win11开始菜单打不开_修复Windows 11点击开始图标无响应【教程】  如何在 Go 中调用动态链接库(.so)中的函数  新手学PHP架构总混淆概念咋办_重点梳理【教程】  如何在Golang中优化文件读写性能_使用缓冲和并发处理  Windows10蓝屏SYSTEM_SERVICE_EXCEPTION_Win10驱动冲突排查  Win11怎么卸载Photos应用_Win11卸载Photos应用方法【教程】  PHP怎么接收前端传的时间戳_处理时间戳参数转换技巧汇总【指南】  Win11怎么检查TPM2.0模块_Windows11受信任平台模块开启状态查询  php485在macos下怎么配置_php485 macOS系统配置指南【解答】  Win11怎么忘记WiFi网络_Win11删除已保存无线连接【教程】  如何在Golang中实现微服务负载均衡_Golang负载均衡策略与实现示例  Win11屏幕亮度突然变暗怎么解决_自动变暗问题处理  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  LINUX怎么查看进程_LINUX ps命令查看运行服务  Win11开机自检怎么关闭_跳过Win11开机磁盘扫描修复方法【技巧】  Python网络日志追踪_请求定位解析【教程】  如何在 Django 中修改用户密码后保持会话不丢失  Win11怎么设置任务栏图标大小_Windows11注册表TaskbarSi修改  Mac如何使用听写功能_Mac语音输入打字【效率技巧】  如何在 Go 中可靠地测试含 time.Time 字段的结构体  Win11任务栏天气怎么关闭 Win11隐藏天气小组件图标【设置】  使用类变量定义字符串常量时的类型安全最佳实践  Win10怎么卸载爱奇艺_Win10彻底卸载爱奇艺方法【步骤】 

 2026-01-01

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.