在Golang的标准库中,log包提供了轻量级的日志功能,不需要引入第三方依赖就能实现基础的日志记录,非常适合小型项目或者快速验证场景使用。下面我们来详细了解log包的核心语法和使用方式。

log包基础输出方法
log包提供了几个常用的导出函数,可以直接调用实现日志输出,最常用的有三个:
- log.Print:输出日志内容,不会自动添加换行符,需要手动添加
- log.Printf:支持格式化输出,和fmt.Printf用法一致
- log.Println:输出日志内容,会自动在末尾添加换行符
下面是这三个方法的基础使用示例:
package main
import (
"log"
)
func main() {
// 使用Print输出日志
log.Print("这是使用Print输出的日志内容")
// 使用Printf格式化输出
name := "test"
log.Printf("这是使用Printf输出的日志,用户名称:%s", name)
// 使用Println输出日志
log.Println("这是使用Println输出的日志内容")
}
自定义日志前缀和标志
默认的日志输出只有内容,没有额外信息,我们可以通过log.SetPrefix设置日志前缀,通过log.SetFlags设置日志的标志位,让日志包含更多有用信息。
log包支持的标志位有以下几种:
| 标志位常量 | 含义 |
|---|---|
| log.Ldate | 输出本地日期,格式为2009/01/23 |
| log.Ltime | 输出本地时间,格式为01:23:23 |
| log.Lmicroseconds | 输出微秒级时间,需要和Ltime一起使用 |
| log.Llongfile | 输出文件名和行号,格式为/path/file.go:123 |
| log>Lshortfile | 输出文件名和行号,格式为file.go:123 |
多个标志位可以通过按位或运算组合使用,示例代码如下:
package main
import (
"log"
)
func main() {
// 设置日志前缀
log.SetPrefix("[INFO] ")
// 设置日志标志,包含日期、时间、短文件名
log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
// 输出日志
log.Println("这是自定义前缀和标志后的日志内容")
}
自定义日志输出位置
默认情况下,log包的日志会输出到标准错误输出(os.Stderr),我们可以通过log.SetOutput方法将日志输出到指定文件或者其他io.Writer接口的实现对象。
下面是将日志输出到指定文件的示例:
package main
import (
"log"
"os"
)
func main() {
// 创建或打开日志文件,如果文件不存在则创建,存在则追加写入
file, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
log.Fatal("打开日志文件失败:", err)
}
defer file.Close()
// 设置日志输出到文件
log.SetOutput(file)
// 输出日志到文件
log.Println("这条日志会被写入到app.log文件中")
}
创建自定义Logger实例
如果我们需要不同的日志配置,比如不同的前缀、不同的输出位置,可以使用log.New函数创建自定义的Logger实例,而不是使用默认的全局Logger。
log.New函数接收三个参数:输出目标io.Writer、日志前缀string、标志位int,返回一个新的Logger实例。
示例代码如下:
package main
import (
"log"
"os"
)
func main() {
// 创建错误日志的Logger,输出到stderr,前缀为[ERROR],包含日期和时间
errorLogger := log.New(os.Stderr, "[ERROR] ", log.Ldate|log.Ltime)
// 创建信息日志的Logger,输出到stdout,前缀为[INFO],包含日期和时间
infoLogger := log.New(os.Stdout, "[INFO] ", log.Ldate|log.Ltime)
// 使用不同的Logger输出日志
infoLogger.Println("这是信息级别的日志")
errorLogger.Println("这是错误级别的日志")
}
注意事项
使用log包的时候需要注意几个点:
- log包的Fatal系列函数(log.Fatal、log.Fatalf、log.Fatalln)在输出日志后会直接调用os.Exit(1)终止程序,使用时需要谨慎
- log包的Panic系列函数(log.Panic、log.Panicf、log.Panicln)在输出日志后会抛出panic,如果没有recover会终止程序
- 如果是高并发场景或者需要更复杂的日志功能,比如日志分级、日志轮转等,建议使用第三方日志库,log包更适合简单的场景