Go使用log更优雅打印输出

有这样一种常见场景, 我在开发调试时,需要大量输出代码.

在开发完成后,不希望这些调试信息输出. 只打印我需要的必要信息

可以使用log库,可以设置输出级别,对于那些调试信息,使用log打印, 其他的需要正常输出的使用fmt


在执行时加一个debug参数就行了

在 Go 语言中,使用 log 包的默认设置,日志级别为 Info。要将日志级别设置为 Debug,你需要使用 flag 包来解析命令行参数,并根据参数设置日志级别。

以下是一个示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package main

import (
"flag"
"fmt"
"log"
"os"
)

func main() {
// 定义一个名为 "debug" 的命令行参数,默认值为 false
debug := flag.Bool("debug", false, "设置调试模式")

// 解析命令行参数
flag.Parse()

// 如果设置了 debug 模式,则将日志级别设置为 Debug
if *debug {
log.SetFlags(log.LstdFlags | log.Lshortfile)
log.SetOutput(os.Stdout)
} else {
// 否则,将日志级别设置为 Info
log.SetFlags(log.LstdFlags)
log.SetOutput(os.Stderr)
}

// 输出日志
log.Println("这是一个信息日志")
log.Printf("这是一个格式化日志:%s\n", "Hello, world!")

if *debug {
log.Println("这是一个调试日志")
}
}

解释:

  1. flag.Bool("debug", false, "设置调试模式"): 定义一个名为 debug 的命令行参数,默认值为 false
  2. flag.Parse(): 解析命令行参数。
  3. if *debug { ... } else { ... }: 根据 debug 参数的值,设置不同的日志级别。
  4. log.SetFlags(log.LstdFlags | log.Lshortfile): 设置日志输出格式,包括时间、文件名和行号。
  5. log.SetOutput(os.Stdout): 将日志输出到标准输出(控制台)。
  6. log.Println("这是一个调试日志"): 仅在 debug 模式下输出调试日志。

运行程序:

  1. 编译程序:go build main.go
  2. 运行程序:
    • ./main - 输出信息日志和错误日志
    • ./main -debug - 输出信息日志、错误日志和调试日志

注意:

  • 使用 log.SetFlags(log.LstdFlags | log.Lshortfile) 可以将文件名和行号添加到日志输出中,方便调试。
  • 你也可以使用其他日志库,例如 logruszap,它们提供了更丰富的功能,例如结构化日志和自定义日志级别。

其实也不咋优雅…

1
2
3
4
5
6
7
// 输出日志
log.Println("这是一个信息日志")
log.Printf("这是一个格式化日志:%s\n", "Hello, world!")

if *debug {
log.Println("这是一个调试日志")
}

还得要写if….

最好能log.Debug()这种的


使用zap

1
2
3
4
5
6
7
8
9
10
// 创建一个 Logger
//logger, _ := zap.NewProduction() // 这样不会输出debug级别的日志
logger, _ := zap.NewDevelopment() // 创建一个开发环境的 Logger,它会输出所有级别的日志

defer logger.Sync() // 确保所有日志都写入文件

// 使用 Logger 输出日志
logger.Info("这是一个信息日志")
logger.Debug("这是一个调试日志")
logger.Error("这是一个错误日志", zap.String("error_message", "发生了错误"))

这样就可以了,不通过flag来控制了,直接在代码里指定是zap.NewProduction 还是 zap.NewDevelopmen



文章目录