go语言中的log 包示例详解

Go语言的log包提供了用于记录日志的基本功能。相比fmt包,log包增加了时间戳、日志级别等日志管理功能,非常适合用于调试和记录运行信息。下面是对log包的详细说明,以及它与fmt包的区别。

1. log包的基础功能

log包中包含一系列函数,可以用于打印带时间戳的日志信息,默认将日志写入标准错误输出(os.Stderr),并在每条日志的开头添加时间戳。

常用函数

log.Print:基本日志输出函数,类似于fmt.Print,但会在输出前添加时间戳。

log.Println:类似于fmt.Println,会在输出前添加时间戳,并在结尾添加换行符。

log.Printf:类似于fmt.Printf,支持格式化输出,并在输出前添加时间戳。

示例代码:

package main
import "log"
func main() {
    log.Print("This is a log message.")
    log.Println("This is another log message.")
    log.Printf("Formatted log: %d + %d = %d", 2, 3, 2+3)
}

2. log包的日志级别函数

log包还提供了两种特殊的日志函数,用于处理错误和程序退出的情况:

log.Fatal:用于记录严重的错误信息,输出日志后会调用os.Exit(1),终止程序执行。

log.Panic:用于记录错误信息,同时调用panic,引发恐慌(程序崩溃并抛出堆栈信息),适合用于调试和处理非正常情况。

示例代码:

package main
import "log"
func main() {
    log.Print("This is a normal log.")
    log.Fatal("This is a fatal error log, program will exit.")  // 输出后程序会退出
    log.Panic("This will not be executed because of Fatal above.")
}

3. 自定义日志输出位置

log包默认将日志输出到标准错误流(os.Stderr),但是可以通过log.SetOutput方法自定义输出位置。可以将日志输出到文件、网络或其他符合io.Writer接口的目标。

示例:将日志输出到文件

package main
import (
    "log"
    "os"
)
func main() {
    file, err := os.Create("app.log")
    if err != nil {
        log.Fatal("Failed to create log file:", err)
    }
    defer file.Close()
    log.SetOutput(file)  // 将日志输出设置为文件
    log.Println("This log will be written to app.log file.")
}

4. 自定义日志前缀和标记

log包允许自定义日志的前缀和格式,帮助识别日志的来源或类型。使用log.SetPrefix方法可以设置日志的前缀,使用log.SetFlags可以控制日志的标记。

日志标记

log包提供了以下几个标记(使用SetFlags设置):

  • log.Ldate:日期(yyyy/mm/dd)。
  • log.Ltime:时间(hh:mm)。
  • log.Lmicroseconds:微秒级时间。
  • log.Llongfile:完整文件路径和行号。
  • log.Lshortfile:简短文件名和行号。
  • log.LUTC:使用UTC时间。
  • log.LstdFlags:默认标记,等价于log.Ldate | log.Ltime

示例:自定义日志前缀和标记

package main
import "log"
func main() {
    log.SetPrefix("INFO: ")                  // 设置日志前缀
    log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)  // 设置日志标记
    log.Println("This is a customized log message.")
}

5. 创建自定义的日志记录器

使用log.New可以创建自定义的日志记录器(Logger),并指定不同的输出目标、前缀和标记。多个日志记录器可以记录不同类型的日志信息。

示例:创建两个不同的日志记录器

package main
import (
    "log"
    "os"
)
func main() {
    // 创建错误日志记录器,输出到标准错误
    errorLogger := log.New(os.Stderr, "ERROR: ", log.Ldate|log.Ltime|log.Lshortfile)
    // 创建信息日志记录器,输出到文件
    infoFile, err := os.Create("info.log")
    if err != nil {
        log.Fatal(err)
    }
    defer infoFile.Close()
    infoLogger := log.New(infoFile, "INFO: ", log.Ldate|log.Ltime)
    infoLogger.Println("This is an informational message.")
    errorLogger.Println("This is an error message.")
}

log包与fmt包的区别

用途不同

  • fmt包主要用于格式化输入和输出,适合输出一般信息,不具备日志管理功能。
  • log包专为日志设计,提供日志记录功能,适合程序中的重要信息、错误、调试信息等的输出。

输出内容不同

  • fmt包输出没有时间戳,默认不包含额外信息。
  • log包输出包含时间戳,且可以设置额外的标记和前缀。

输出位置

  • fmt包的输出目标默认为标准输出(os.Stdout),可以通过fmt.Fprint将输出定向到指定目标。
  • log包的默认输出为标准错误(os.Stderr),且可以通过log.SetOutput轻松修改输出目标。

日志级别

  • fmt包没有日志级别的概念。
  • log包提供了日志级别的支持(如FatalPanic)。

程序控制

  • fmt包的函数不会影响程序的控制流程。
  • log.Fatal会终止程序,log.Panic会引发恐慌,帮助处理异常情况。

总结

  • fmt包适合通用的格式化输出,如打印普通消息、调试输出等。
  • log包适合用于正式的日志记录,提供时间戳、日志级别、日志标记和自定义输出等特性,能够更好地记录和追踪程序的运行状态。

到此这篇关于go语言中的log 包详解的文章就介绍到这了,更多相关go语言log 包内容请搜索恩蓝小号以前的文章或继续浏览下面的相关文章希望大家以后多多支持恩蓝小号!

原创文章,作者:HGPHI,如若转载,请注明出处:https://www.wangzhanshi.com/n/5598.html

(0)
HGPHI的头像HGPHI
上一篇 2024年12月17日 19:27:45
下一篇 2024年12月17日 19:27:47

相关推荐

  • Go语言中如何进行包管理

    Go语言是一种编译型、静态类型、并发型、并具有垃圾回收功能的编程语言。在Go语言中,包(package)是函数和数据的集合,用于组织代码,实现模块化开发。通过包,开发者可以将相关的…

    Golang 2024年12月17日
  • Go项目的目录结构详解

    项目目录结构如何组织,一般语言都是没有规定。但Go语言这方面做了规定,这样可以保持一致性。 1、一般的,一个Go项目在GOPATH下,会有如下三个目录: 复制代码 代码如下:|&#…

    Golang 2024年12月29日
  • golang读取yaml配置文件的方法实现

    Viper Viper是适用于Go应用程序的完整配置解决方案。它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式。它支持以下特性: 设置默认值 从JSON、TOML…

    Golang 2024年12月17日
  • Go语言中缓冲bufio的原理解读与应用实战

    bufio是Go语言标准库中的一个重要包,它提供了带缓冲的I/O操作,用于包装io.Reader或io.Writer对象,以减少I/O操作的次数,从而提高读写性能。本文将结合实际案…

    2024年12月17日
  • Golang实现内网穿透详解

    我们经常会遇到一个问题,如何将本机的服务暴露到公网上,让别人也可以访问。我们知道,在家上网的时候我们有一个 IP 地址,但是这个 IP 地址并不是一个公网的 IP 地址,别人无法通…

    2024年12月17日
  • Golang日志库logrus的介绍与使用示例代码

    logrus概述  简介 Logrus 是一个流行的 Go 语言日志库,它提供了结构化日志和多种日志级别的功能。Logrus 非常灵活,支持自定义日志格式和输出,被许多 …

    Golang 2024年12月17日
  • go语言多线程操作实现

    引言 多线程是一种编程概念,它允许操作系统同时处理多个任务。在多线程环境中,每个线程都代表了一个任务的执行流程。这些线程可以同时运行,使得程序能够更有效地利用计算资源,特别是在多核…

    Golang 2024年12月17日
  • Go语言使用漏桶算法和令牌桶算法来实现API限流

    在现代 Web 应用程序中,流量的突增是不可避免的。为防止服务器被过多的请求压垮,限流(Rate Limiting) 是一个至关重要的技术手段。 本文将通过 Go 语言的 Gin …

    Golang 2024年12月17日
  • Go语言中命令行参数解析工具pflag的使用指南

    在使用 Go 进行开发的过程中,命令行参数解析是我们经常遇到的需求。尽管 Go 标准库提供了 flag 包用于实现命令行参数解析,但只能满足基本需要,不支持高级特性。于是 Go 社…

    Golang 2024年12月17日
  • 一起聊聊Go语言中的语法糖的使用

    前言 由于工作变动,我现在已经开始使用Golang了。用了一段时间之后,我发现Golang(后面简称Go)中的语法糖还蛮多的,有些语法糖还让会让人很懵逼。那么接下来,让我以一个曾经…

    Golang 2024年12月29日

发表回复

登录后才能评论