全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

如何使用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  # 第三方  # 不支持  # 自己的  # 这是  # 如果你  # 很多人  # 帮你  # 这件事  # 用了  # 不存在 


相关文章: 如何选择网络建站服务器?高效建站必看指南  建站之星在线版空间:自助建站+智能模板一键生成方案  实例解析Array和String方法  内部网站制作流程,如何建立公司内部网站?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  如何选择域名并搭建高效网站?  如何快速上传自定义模板至建站之星?  如何基于PHP生成高效IDC网络公司建站源码?  javascript中的try catch异常捕获机制用法分析  定制建站方案优化指南:企业官网开发与建站费用解析  如何使用Golang安装API文档生成工具_快速生成接口文档  清除minerd进程的简单方法  如何快速登录WAP自助建站平台?  实例解析angularjs的filter过滤器  如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  南宁网站建设制作定制,南宁网站建设可以定制吗?  C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换  如何在西部数码注册域名并快速搭建网站?  PHP正则匹配日期和时间(时间戳转换)的实例代码  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  C#怎么创建控制台应用 C# Console App项目创建方法  Python路径拼接规范_跨平台处理说明【指导】  如何在局域网内绑定自建网站域名?  网站网页制作专业公司,怎样制作自己的网页?  广州建站公司哪家好?十大优质服务商推荐  如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法  阿里云网站制作公司,阿里云快速搭建网站好用吗?  建站168自助建站系统:快速模板定制与SEO优化指南  建站之星代理平台如何选择最佳方案?  代刷网站制作软件,别人代刷火车票靠谱吗?  如何快速生成ASP一键建站模板并优化安全性?  如何通过wdcp面板快速创建网站?  网站建设设计制作营销公司南阳,如何策划设计和建设网站?  电脑免费海报制作网站推荐,招聘海报哪个网站多?  如何通过网站建站时间优化SEO与用户体验?  网站建设制作、微信公众号,公明人民医院怎么在网上预约?  ,sp开头的版面叫什么?  Android自定义控件实现温度旋转按钮效果  存储型VPS适合搭建中小型网站吗?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  SQL查询语句优化的实用方法总结  为什么Go需要go mod文件_Go go mod文件作用说明  已有域名如何快速搭建专属网站?  高防服务器租用首荐平台,企业级优惠套餐快速部署  宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?  电商平台网站制作流程,电商网站如何制作?  太原网站制作公司有哪些,网约车营运证查询官网?  如何高效完成独享虚拟主机建站?  微信小程序 五星评分(包括半颗星评分)实例代码  定制建站平台哪家好?企业官网搭建与快速建站方案推荐 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。