Golang 库: 为什么 Golang slog 库不支持 slog.Fatal API

原文链接: https://tangx.in/posts/2023/01/06/why-dont-golang-slog-support-fatal-api/

使用 slog 默认不支持 Fatal

如果直接把 slog 当成 log 使用, 会有一点点头疼

func main() {slog.Debug("debug")slog.Info("info")slog.Warn("warn")slog.Error("err", fmt.Errorf("game over"))// slog.Fatal("don't support")
}// 2023/01/06 07:41:50 INFO info
// 2023/01/06 07:41:50 WARN warn
// 2023/01/06 07:41:50 ERROR err err="game over"
  1. slog 默认日志级别info, 无法输出 DEBUG 日志。

    • 需要自定义 handler 实现日志级别判断。 参考 Golang 库: 怎么使用 golang slog 设置日志 Debug 等级
  2. slog 默认不支持 Fatal API。
    • 换而言之, 无法使用 slog 终止进程了。

关闭 Fatal 这个我还能理解, 毕竟很多 初始化连接 需要关闭, 直接退出太不优雅了。

golang.org/x/exp/slog 中提到, OpenTelemetry 支持 TraceFatal, 但是 slog 并不支持, 但是可以通过对日志等级设置合适的值, OpenTelemetry 的日志等级也可以作为 slog 的日志等级

OpenTelemetry also has the names TRACE and FATAL, which slog does not. But those OpenTelemetry levels can still be represented as slog Levels by using the appropriate integers.

除此之外, 并没有其他关于 Fatal API 的讨论了。

我猜 Go 官网是希望我们, 在终止前做一些退出处理, 不要太过于暴力。

退出前释放资源

例如下面案例,

  1. 在程序中遇到了 panic
  2. recover 捕获后进行了资源释放操作,
  3. 最后在执行 退出
func main() {initConn()defer func() {releaseConn()if err := recover(); err != nil {slog.Warn("Fatal", "panic", err)os.Exit(1)}}()if err := do(); err != nil {panic(err)}
}func do() error {slog.Info("do logic statement")return fmt.Errorf("game over")
}// 初始化连接
func initConn() {slog.Info("connect to redis")
}// 释放连接
func releaseConn() {slog.Warn("disconnect from redis")
}// 2023/01/06 08:07:01 INFO connect to redis
// 2023/01/06 08:07:01 INFO do logic statement
// 2023/01/06 08:07:01 WARN disconnect from redis
// 2023/01/06 08:07:01 WARN Fatal panic="game over"
// exit status 1

加入一定要强制退出怎么办?

那如果一定要退出怎么办了? 可能就只有自己调 os.Exit(n)

func main() {slog.Error("err", fmt.Errorf("game over"))os.Exit(1)// skipslog.Debug("debug")slog.Info("info")slog.Warn("warn")
}// 2023/01/06 07:53:16 ERROR err err="game over"// exit status 1

什么时候应该是用 Fatal

在找资料的时候, 在 StackOverflow 上找到一个问题 应该使用 log.Fatal 吗? 什么时候用?

前提条件, 根据 UNIX 约定,遇到错误的进程应尽早失败并返回非零退出代码。

  1. init() 函数中使用, 这时候 main() 还没调用。
  2. 明确知道错误发生原因, 并且无法挽回。 例如读取文件失败后, 没必要进行后续操作。
  3. 在不可逆的过程中发生错误。 例如 cp -f 复制文件且强制覆盖。 如果程序没有错误退出, 就是默认成功。

https://stackoverflow.com/a/33890104

互相吹捧, 共同进步

欢迎和我一起学习进步, 如果有什么问题, 可以给我私信留言。 或者

  1. 加我好友 线下讨论。

Golang 库: 为什么 Golang slog 库不支持 `slog.Fatal` API相关推荐

  1. viper4android io错误,golang常用库之配置文件解析库-viper使用详解

    一.viper简介 viper 配置管理解析库,是由大神 Steve Francia 开发,他在google领导着 golang 的产品开发,他也是 gohugo.io 的创始人之一,命令行解析库 c ...

  2. golang优秀开源框架和库

    作者:承诺一时的美丽 链接:https://www.jianshu.com/u/6719426bf97e 來源:简书 音频和音乐 用于操纵音频的库. flac - Native Go FLAC解码器. ...

  3. golang 并发同步(sync 库)-- 单例模式的实现(六)

    文章目录 golang 单例模式 非线程安全的单例模式 加锁的单例模式 sync.Once 更优雅的方式实现单例模式 更优雅的方式防止主 go 程提前退出 sync.Cond--golang 指挥家 ...

  4. go语言调用c 的头文件 so,Golang生成共享库(shared library)以及Golang生成C可调用的动态库.so和静态库.a...

    Golang类似于C的静态语言,效率也接近于C,如果Golang也可以导出可供C调用的库,那可以和很多高级语言say goodbye了,goodbye似乎又有点武断,但至少说,Golang可以做很多事 ...

  5. golang 相互引用_Golang与C互用以及调用C的so动态库和a静态库

    Golang与C的关系非常密切,下面主要介绍在Golang中使用C. 一. Golang中嵌入C代码 1 package main 2 3 //#include 4 //#include 5 /* 6 ...

  6. golang常用库之-uuid相关库(satori/go.uuid、google/uuid)

    文章目录 golang常用库之-uuid相关库

  7. golang常用库之-操作redis go-redis/redis库、 go-redsync/redsync库(redis分布式锁)

    文章目录 golang常用库之-操作redis go-redis/redis库. go-redsync/redsync库(redis分布式锁) 一.什么是go-redis/redis库 go-redi ...

  8. Golang生成C动态库.so和静态库.a

    Go 生成C动态库.so和静态库.a 源代码 package mainimport "C" import "fmt"//export hello func he ...

  9. 清华大学开源迁移学习算法库:基于PyTorch实现,支持轻松调用已有算法

    机器之心报道 编辑:魔王 作者:清华大学大数据研究中心 近日,清华大学大数据研究中心机器学习研究部开源了一个高效.简洁的迁移学习算法库 Transfer-Learn,并发布了第一个子库--深度领域自适 ...

最新文章

  1. Selenium 爬虫时遇到的问题 Selenium message:session not created
  2. [转]国内各大互联网公司相关技术站点2.0版 (集合腾讯、阿里、百度、搜狐、新浪、360等共49个)...
  3. python类修饰器_《Python有什么好学的》之修饰器
  4. 范式青春er,寻找同行的你!
  5. 【线段树】海报(loj 3264)
  6. 携程apollo系列-个人开发环境搭建
  7. 使用ASP.NET 2.0 Profile存储用户信息
  8. linux的帮助命令及区别,linux经常使用命令以及帮助命令
  9. java date 日期部分_Java处理Date时间格式的各种场景工具类(二)
  10. 从前端开发者看待用友建筑云移动端单点登录与报错原因
  11. java sencha_开始使用Sencha Cmd
  12. Java 反射和映射
  13. jquery api的整体解读
  14. 如何避免成为一个油腻的中年猥琐男
  15. 论文格式排版技巧(word版)
  16. QDateTime 和tm 的时间显示
  17. 三维实时云渲染平台解决方案
  18. 微信小程序--火车票查询
  19. SharePoint 常用开发工具
  20. Commands that may modify the data set are disabled, because this instance is configured to report er

热门文章

  1. 数据库的并发操作通常会带来三个问题
  2. 智慧城市-十问十答(二)
  3. 【Linux--------基本指令】
  4. 优课联盟 实境英语 Test for Unit 8
  5. 备战电设 滚球控制系统——机械结构
  6. 使用了Dialog,Android开发提升一个档次
  7. Day15-集合(Collection、红黑树 (ListSet )并发修改异常,泛型深入)
  8. java计算机毕业设计MVC土特产交易平台系统MyBatis+系统+LW文档+源码+调试部署
  9. 使用ngnix实现跨域视频截图
  10. css 滚动条样式和table