概述
log
模块用于在程序中输出日志,其使用方式类似于 fmt
包中的 Print
。以下是一个最简单的示例:
package main
import "log"
func main() {
log.Print("Hello World")
}
上面的程序会在命令行打印一条日志:
>>> 2023/08/29 16:48:06 Hello World
Logger
Logger
是用于写入日志的基本组件。在 log
模块中,存在一个标准的 Logger
,可以直接通过 log
包进行访问,因此在上面的示例中,使用 log.Print
可以直接输出日志。但是在实际应用中,不同类型的日志可能需要不同的需求,仅使用标准 Logger
可能无法满足,这时可以通过创建多个 Logger
实例,将不同类型的日志分类输出。
创建 Logger
在使用 Logger
之前,需要通过 New
函数创建一个 Logger
对象。函数声明如下:
func New(out io.Writer, prefix string, flag int) *Logger
函数接收三个参数:
out
:日志输出的 IO 对象,通常是标准输出os.Stdout
、标准错误os.Stderr
,或者绑定到文件的 IO。prefix
:日志前缀,可以是任意字符串。flag
:日志包含的通用信息标识位,用于设置日志的格式。
一条日志由三个部分组成,其结构如下:
{日志前缀} {标识1} {标识2} ... {标识n} {日志内容}
- 日志前缀:通过
prefix
参数设置,可以是任意字符串。 - 标识:通过
flags
参数设置,用于显示不同的通用信息。log
模块中定义了以下标识,多个标识可以通过按位或(|
)进行组合:Ldate
:显示当前日期(当前时区)。Ltime
:显示当前时间(当前时区)。Lmicroseconds
:显示当前时间(微秒级)。Llongfile
:显示包含路径的完整文件名。Lshortfile
:显示不包含路径的文件名。LUTC
:Ldate
和Ltime
使用 UTC 时间。LstdFlags
:标准Logger
的标识,等价于Ldate | Ltime
。
以下示例展示了如何创建一个自定义 Logger
并输出日志:
package main
import (
"log"
"os"
)
func main() {
prefix := "[CUSTOM LOG]"
logger := log.New(os.Stdout, prefix, log.LstdFlags | log.Lshortfile)
logger.Print("Hello World")
}
上面的程序将输出如下内容,可以看到日志由前缀、标识和内容三个部分组成:
[CUSTOM LOG] 2023/08/29 17:12:19 main.go:11: Hello World
更多的输出方式
log
模块中的日志输出分为三类:Print
、Fatal
和 Panic
。
- Print:普通输出。
- Fatal:在执行完
Print
之后,调用os.Exit(1)
终止程序。 - Panic:在执行完
Print
之后,调用panic()
抛出异常。
除了基础的 Print
方法外,log
包还提供了 Printf
和 Println
方法用于格式化输出。对于 Fatal
和 Panic
也有类似的函数。
日志分级
Go 的 log
模块没有提供日志分级的功能。如果需要,可以在 log
的基础上自行实现。以下是一个简单的 INFO
方法实现:
package main
import (
"log"
"os"
)
func main() {
var (
logger = log.New(os.Stdout, "INFO: ", log.Lshortfile)
infof = func(info string) {
logger.Print(info)
}
)
infof("Hello World")
}
通过以上内容,您可以了解如何使用 log
模块输出日志,并根据不同需求自定义 Logger
实例。此外,还可以通过简单的函数封装实现自定义的日志分级功能。