Go 标准库 log 不支持日志级别,仅提供 Print/Fatal/Panic 等函数,无 Info/Warn/Error 分级;需用第三方库(如 logrus、zap)或自行封装前缀式 Logger。
log 本身不支持日志级别这是最容易踩的坑:Go 原生 log 包没有 Info、Warn、Error 等分级接口。它只提供 Print、Printf、Println、Fatal、Fatalf、Panic、Panicf 这几组函数,其中只有 Fatal 和 Panic 会终止程序,其余都只是输出——它们在语义上并无级别区分。
如果你看到别人代码里写了 log.Info(...),那一定是用了第三方库(比如 logrus、zap 或 zerolog),不是标准库。
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,方便管道处理或重定向到文件ErrorLogger 和 FatalLogger 输出到 os.Stderr,符合 Unix 习惯,也便于分离错误流FatalLogger.Fatal() 仍会调用 os.Exit(1),不可恢复Fatal 不是 “严重错误日志”,而是 “程序必须退出” 的信号很多人误以为 log.Fatal 是用来记录“高危错误”的,其实它核心语义是“这个错误发生后,程序已无法安全继续运行”。比如:
相反,以下情况不该用 Fatal:
滥用 Fatal 会导致服务频繁崩溃,尤其在微服务或容器环境中,可能触发反复重启循环。
标准库 log 的设计哲学是“足够简单”,它不打算替代专业日志系统。一旦项目规模上升、需要如下能力,就该考虑迁移:
ctx 中的 traceID 自动注入每条日志)推荐起步选择:github.com/sirupsen/logrus(API 清晰,文档全)或 go.uber.org/zap(高性能,适合高吞吐场景)。它们都支持标准库风格的 log.WithField 或 logger.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
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。