全网整合营销服务商

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

免费咨询热线: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  # 第三方  # 不支持  # 自己的  # 这是  # 如果你  # 很多人  # 帮你  # 这件事  # 用了  # 不存在 


相关文章: 网站制作费用多少钱,一个网站的运营,需要哪些费用?  Android自定义listview布局实现上拉加载下拉刷新功能  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  黑客入侵网站服务器的常见手法有哪些?  零服务器AI建站解决方案:快速部署与云端平台低成本实践  个人网站制作流程图片大全,个人网站如何注销?  Swift中循环语句中的转移语句 break 和 continue  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  如何在万网自助建站中设置域名及备案?  如何快速搭建自助建站会员专属系统?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  ,在苏州找工作,上哪个网站比较好?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  外汇网站制作流程,如何在工商银行网站上做外汇买卖?  建站之星ASP如何实现CMS高效搭建与安全管理?  广东专业制作网站有哪些,广东省能源集团有限公司官网?  建站主机核心功能解析:服务器选择与网站搭建流程指南  香港服务器租用每月最低只需15元?  网站制作知乎推荐,想做自己的网站用什么工具比较好?  html制作网站的步骤有哪些,iapp如何添加网页?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  C#怎么使用委托和事件 C# delegate与event编程方法  如何快速搭建虚拟主机网站?新手必看指南  c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  建站主机与虚拟主机有何区别?如何选择最优方案?  微信推文制作网站有哪些,怎么做微信推文,急?  如何在腾讯云服务器上快速搭建个人网站?  如何用wdcp快速搭建高效网站?  湖州网站制作公司有哪些,浙江中蓝新能源公司官网?  北京制作网站的公司,北京铁路集团官方网站?  如何快速打造个性化非模板自助建站?  如何在IIS7中新建站点?详细步骤解析  ,怎么在广州志愿者网站注册?  详解jQuery中基本的动画方法  建站主机选虚拟主机还是云服务器更好?  制作网站的模板软件,网站怎么建设?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  如何在西部数码注册域名并快速搭建网站?  如何通过服务器快速搭建网站?完整步骤解析  c++怎么用jemalloc c++替换默认内存分配器【性能】  武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?  建站之星IIS配置教程:代码生成技巧与站点搭建指南  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  如何在宝塔面板创建新站点?  C++中引用和指针有什么区别?(代码说明)  如何用5美元大硬盘VPS安全高效搭建个人网站?  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  成都网站制作报价公司,成都工业用气开户费用?  家具网站制作软件,家具厂怎么跑业务? 

您的项目需求

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