学 Go,最常用的技能是什么?打日志

⛳️ 实战场景

在日常开发中,用到做最多的知识点除了字符串操作外,就数日志模块最常用了,毕竟有日志调试和修改 BUG 才方便,而且如果你是编程知识的初学者,更是建议先学习一下日志相关知识。

在 Go 中,内置了 log 包实现简单日志的记录功能,如果你有 Python 中 logger 模块的使用经验,学习起来也是非常简单的。

log 包中定义了一个 Logger 类型,其中包含的函数有 Print 系列函数, Fatal 系列函数, Panic 系列。

接下来直接看一段 log 包基本使用的代码:

package main

import (
    "log"
)

func main() {
    log.Println("输出普通日志") // 待换行
    v := "xxxx"
    log.Printf("输出格式化 %s 日志 \n", v)

    log.Fatalln("输出fatal的日志")
    log.Panicln("输出panic的日志")
}

输出内容如下所示:

2022/07/31 16:47:01 输出普通日志
2022/07/31 16:47:01 输出格式化 xxxx 日志
2022/07/31 16:47:01 输出fatal的日志
exit status 1

可以发现,它与标准输出有一个很大的不同,那就是每条输出信息都携带着当前时间。

[En]

It can be found that there is a big difference between it and the standard output, that is, each piece of output information carries the current time.

在时间的时候,可以将 log.Fatallnlog.Panicln 信息对调,就能得到不同的输出,继而测试出 fatalpanic 的用法。

在上文已经看到,默认的 log 日志会输出时间信息,我们可以在此基础上进行扩展,将日志的记录到文件中,输出错误的行号。

此时需要使用 SetFlags 函数,具体如下所示。

package main

import (
    "log"
)

func main() {
    // 文件全路径名+行号,错误的时间(精确到微秒级别),错误信息
    log.SetFlags(log.Llongfile | log.Lmicroseconds | log.Ldate)
    log.Println("日志输出")
}

此时的日志输出如下:

[En]

The log output at this time is as follows:

2022/07/31 16:53:23.468018 G:/goProject/06_demo.go:10: 日志输出

log 包还提供了其它选项,都是常量,即上述代码 SetFlags 的参数部分内容。

const (
    Ldate         = 1 << iota     // 日期:2022/07/31
    Ltime                         // 时间:16:53:23
    Lmicroseconds                 // 微秒级别时间:16:53:23.468018
    Llongfile                     // 文件全路径名+行号: G:/goProject/06_demo.go:10
    Lshortfile                    // 文件名+行号:06_demo.go:10
    LUTC                          // 使用UTC时间
    LstdFlags     = Ldate | Ltime // 标准logger的初始值
)

还可以对日志的前缀进行设置,使用 SetPrefix 函数即可。


func main() {
    log.SetFlags(log.Llongfile | log.Lmicroseconds | log.Ldate)
    log.Println("日志输出1")
    log.SetPrefix("[橡皮擦专用]")
    log.Println("日志输出2")
}

此时的日志输出如下:

[En]

The log output at this time is as follows:

2022/07/31 16:57:19.350118 G:/goProject/06_demo.go:9: 日志输出1
[橡皮擦专用]2022/07/31 16:57:19.358230 G:/goProject/06_demo.go:11: 日志输出2

以上日志都是在控制台进行的输出,如果希望将日志记录到文件中,可以配置日志输出位置,此时用到的函数是 SetOutput,代码如下:

package main

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

func main() {

    logFile, err := os.OpenFile("./error.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
    if err != nil {
        fmt.Println("打开文件失败,错误信息:", err)
        return
    }

    // 设置输出文件
    log.SetOutput(logFile)

    log.SetFlags(log.Llongfile | log.Lmicroseconds | log.Ldate)
    log.Println("日志输出1")
    log.SetPrefix("[橡皮擦专用]")
    log.Println("日志输出2")
}

如果运行代码,您会发现在项目的根目录中创建了一个包含所有日志输出的文件。

[En]

If you run the code, you will find that a file is created in the root directory of the project that contains all the log output.

在创建 logger 对象的时候,还可以使用其构造函数 New 实现。

New 函数的的原型如下:

func New(out io.Writer, prefix string, flag int) *Logger

接下来,只需查看示例代码并学习即可。

[En]

Next, just look at the sample code and learn.

package main

import (
    "log"
    "os"
)

func main() {
    logger := log.New(os.Stdout, "[橡皮擦专用前缀]", log.Lshortfile|log.Ldate)
    logger.Println("普通日志")
}

可以看到比前文的代码要精简了许多,实战遇到简单日志,可以直接采用 New 相关写法即可。

📢📢📢📢📢📢 💗 你正在阅读 【梦想橡皮擦】 的博客 👍 阅读完毕,可以点点小手赞一下 🌻 发现错误,直接评论区中指正吧 📆 橡皮擦的第 篇原创博客

Original: https://blog.51cto.com/cnca/5593296
Author: 梦想橡皮擦
Title: 学 Go,最常用的技能是什么?打日志

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/500643/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球