编程 Go语言中的`log`日志模块及其使用方法

2024-11-19 00:57:47 +0800 CST views 1090

概述

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:显示不包含路径的文件名。
    • LUTCLdateLtime 使用 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 模块中的日志输出分为三类:PrintFatalPanic

  • Print:普通输出。
  • Fatal:在执行完 Print 之后,调用 os.Exit(1) 终止程序。
  • Panic:在执行完 Print 之后,调用 panic() 抛出异常。

除了基础的 Print 方法外,log 包还提供了 PrintfPrintln 方法用于格式化输出。对于 FatalPanic 也有类似的函数。

日志分级

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 实例。此外,还可以通过简单的函数封装实现自定义的日志分级功能。

复制全文 生成海报 编程 Go语言 日志管理

推荐文章

Go 单元测试
2024-11-18 19:21:56 +0800 CST
Golang - 使用 GoFakeIt 生成 Mock 数据
2024-11-18 15:51:22 +0800 CST
PHP 如何输出带微秒的时间
2024-11-18 01:58:41 +0800 CST
Vue3 中提供了哪些新的指令
2024-11-19 01:48:20 +0800 CST
Vue3 实现页面上下滑动方案
2025-06-28 17:07:57 +0800 CST
Vue3中如何使用计算属性?
2024-11-18 10:18:12 +0800 CST
js生成器函数
2024-11-18 15:21:08 +0800 CST
用 Rust 玩转 Google Sheets API
2024-11-19 02:36:20 +0800 CST
Boost.Asio: 一个美轮美奂的C++库
2024-11-18 23:09:42 +0800 CST
html一个包含iPhoneX和MacBook模拟器
2024-11-19 08:03:47 +0800 CST
404错误页面的HTML代码
2024-11-19 06:55:51 +0800 CST
一个收银台的HTML
2025-01-17 16:15:32 +0800 CST
介绍 Vue 3 中的新的 `emits` 选项
2024-11-17 04:45:50 +0800 CST
JavaScript设计模式:装饰器模式
2024-11-19 06:05:51 +0800 CST
一文详解回调地狱
2024-11-19 05:05:31 +0800 CST
如何在Vue3中处理全局状态管理?
2024-11-18 19:25:59 +0800 CST
在 Nginx 中保存并记录 POST 数据
2024-11-19 06:54:06 +0800 CST
Vue3中的组件通信方式有哪些?
2024-11-17 04:17:57 +0800 CST
html流光登陆页面
2024-11-18 15:36:18 +0800 CST
JavaScript设计模式:适配器模式
2024-11-18 17:51:43 +0800 CST
JavaScript 实现访问本地文件夹
2024-11-18 23:12:47 +0800 CST
liunx服务器监控workerman进程守护
2024-11-18 13:28:44 +0800 CST
MySQL 主从同步一致性详解
2024-11-19 02:49:19 +0800 CST
程序员茄子在线接单