Go标准库:log
彪悍的人生不需要解释,那么彪悍的模块也不需要解释,例如今天所讨论的 log
模块,就绝对称得上是简明易懂、短小精干,只需稍微花个十来分钟阅读源码就可以理解并使用,非常具有 go
的味道。
示例
最简单的应用:
输出:
通过 Logger 对象指定写入位置和自定义前缀
一个结构体
log
模块定义了名为 Logger
的结构体,用来打理一切和日志有关的操作:
Logger
中仅有5个成员变量,其含义如下:
成员 | 含义 |
---|---|
outMu | 输出锁,实现并发环境下有序的输出 |
out | 输入对象,表示日志输出的目的地 |
prefix | 用户设置的日志前缀 |
flag | 配置项,一共有8个开关项 |
isDiscard | 内部使用,记录输出对象是否为丢弃,当输出目标是丢弃时,输出函数不再处理,直接返回 |
flag
表示的配置项有这些:
配置项 | 含义 | 示例 |
---|---|---|
Ldate | 添加日期 | 2009/01/23 |
Ltime | 添加时间 | 01:23:23 |
Lmicroseconds | 添加微秒 | 01:23:23.123123 |
Llongfile | 添加完整的日志产生的文件和行数 | /a/b/c/d.go:23 |
Lshortfile | 添加简短的日志产生的文件和行数 | d.go:23 |
LUTC | 使用UTC时间,不使用本地时区 | |
Lmsgprefix | 将前缀至于行首,而非消息前 | 2024/03/01 10:30:58 [Custom prefix]Hello Log! |
LstdFlags | 等于 Ldate | Ltime | 设置日期时间的快捷方法 |
两种入口
使用者可以自己创建 Logger
对象,从而定制日志输出的目标、字符串前缀、配置项等,然而更简单的方式是直接使用 log
模块提供的公共函数。这些函数使用 log
模块内置的 Logger
对象、使用 os.stdOut
作为输出、没有前缀并使用 LstdFlags
作为默认配置。
或者自己创建 Logger
实现更多的定制化需求,或是创建多个 Logger
将日志发往不同地方等:
三类输出方式
不管是如何创建的 Logger
,都提供了相同的输出方式,即三类、六种功能函数:
- Print[f|ln]
- Fatal[f|ln]
- Panic[f|ln]
函数 | 含义 |
---|---|
Printf | 输出日志 |
Println | 输出日志并换行 |
Fatalf | 输出日志,之后退出程序 |
Fatalln | 输出日志并换行,之后退出程序 |
Panicf | 输出日志,之后向上抛出panic,可能退出程序或被recover |
Panicln | 输出日志并换行,之后向上抛出panic,可能退出程序或被recover |
总结
Go
提供的日志模块非常简单,清晰易懂,便于使用者将其封装为各种业务模块。使用方法简单到堪称优雅的程度,再次提醒我们在使用 Go
工作的过程中,要反复不断的去学习标准库,体会其少即是多的设计思想。
Go标准库:log
https://vitsumoc.github.io/Go标准库:log.html