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


    ⛳️ 实战场景

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

    log 包 - 使用 Logger

    在 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的日志")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    输出内容如下所示:

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

    可以发现其与标准输出有一个大的差异点,即每条输出信息都携带了当下时间。

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

    Logger 配置

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

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

    package main
    
    import (
    	"log"
    )
    
    func main() {
    	// 文件全路径名+行号,错误的时间(精确到微秒级别),错误信息
    	log.SetFlags(log.Llongfile | log.Lmicroseconds | log.Ldate)
    	log.Println("日志输出")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    此时的日志输出内容如下所示:

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

    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的初始值
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

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

    此时的日志输出如下内容:

    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
    
    • 1
    • 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")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    这是运行代码,就会发现会在项目根目录创建一个文件,其中包含所有日志输出。

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

    使用 New 创建 logger

    New 函数的的原型如下:

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

    接下来直接看示例代码学习即可。

    package main
    
    import (
    	"log"
    	"os"
    )
    
    func main() {
    	logger := log.New(os.Stdout, "[橡皮擦专用前缀]", log.Lshortfile|log.Ldate)
    	logger.Println("普通日志")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

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

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

    从订购之日起,案例 5 年内保证更新

  • 相关阅读:
    c++ 继承与多态
    时间序列预测实战(十五)PyTorch实现GRU模型长期预测并可视化结果
    带头双向循环链表
    2023最新SSM计算机毕业设计选题大全(附源码+LW)之java宠物寄养平台设计03zp5
    【Netty 的优化和参数】
    Python进阶--爬取美女图片壁纸(基于回车桌面网的爬虫程序)
    ElasticSearch的安装部署-----图文介绍
    由国内知名企业开源人工智能项目想到的
    前端新特性
    SQL如何从字符串截取指定字符(LEFT、MID、RIGHT三大函数)
  • 原文地址:https://blog.csdn.net/hihell/article/details/126087333