go中log包的实现示例

 更新时间:2025年09月30日 09:49:31   作者:{⌐■_■}  
log包是Go语言标准库中的日志库,用于记录程序的运行信息,本文主要介绍了go中log包的实现示例,具有一定的参考价值,感兴趣的可以了解一下

log 包是 Go 语言标准库中的日志库,用于记录程序的运行信息。它提供了简单的日志记录功能,适合开发阶段的调试和生产环境的基本日志输出需求。

log 包的核心功能

  • 输出日志信息到标准输出或文件。
  • 提供多种日志级别(通过扩展,如 log.Logger)。
  • 支持自定义日志前缀和时间戳格式。
  • 易于集成到更复杂的日志系统中。

log 包的常用函数

  • log.Print:输出日志信息(类似 fmt.Print)。
  • log.Println:输出日志信息并在末尾添加换行符(类似 fmt.Println)。
  • log.Printf:按指定格式输出日志信息(类似 fmt.Printf)。
  • log.Fatal:输出日志信息后调用 os.Exit(1) 终止程序。
  • log.Panic:输出日志信息后引发 panic。

示例代码:

package main

import "log"

func main() {
    log.Print("这是一条普通日志")
    log.Println("这是一条带换行的日志")
    log.Printf("这是一条格式化日志:变量值为 %d", 42)

    // Fatal 和 Panic 示例(请注释其中之一以避免程序中断)
    // log.Fatal("这是一条致命日志,程序将在日志后退出")
    // log.Panic("这是一条会引发 panic 的日志")
}

输出示例:

2024/12/09 12:00:00 这是一条普通日志
2024/12/09 12:00:00 这是一条带换行的日志
2024/12/09 12:00:00 这是一条格式化日志:变量值为 42

自定义日志功能

log 包允许创建自定义的 Logger 实例,可以指定输出目标、前缀和日志标志。

  • log.New:创建新的 Logger 实例。
  • log.Flags:设置日志格式标志(如日期、时间、微秒、文件行号)。
  • log.SetOutput:更改日志输出位置(如文件)。

示例代码:自定义日志前缀和输出文件

package main

import (
    "log"
    "os"
)

func main() {
    // 打开日志文件
    file, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
    if err != nil {
        log.Fatalf("无法打开日志文件: %v", err)
    }
    defer file.Close()

    // 创建自定义 Logger
    logger := log.New(file, "INFO: ", log.Ldate|log.Ltime|log.Lshortfile)

    // 记录日志
    logger.Println("应用程序启动")
    logger.Printf("当前状态:%s", "运行中")

    // 错误日志示例
    logger.SetPrefix("ERROR: ")
    logger.Println("发生错误,无法连接数据库")
}

输出日志文件内容:

INFO: 2024/12/09 12:00:00 main.go:20: 应用程序启动
INFO: 2024/12/09 12:00:00 main.go:21: 当前状态:运行中
ERROR: 2024/12/09 12:00:00 main.go:24: 发生错误,无法连接数据库

企业级使用案例

在企业应用中,log 包通常与其他工具(如多模块日志记录、远程日志收集等)结合使用。以下示例展示了一个基于 log 包的多级日志记录器:

示例代码:多级日志记录

package main

import (
    "log"
    "os"
)

// Logger 定义多级日志记录器
type Logger struct {
    Info  *log.Logger
    Error *log.Logger
}

func NewLogger(infoFile, errorFile string) (*Logger, error) {
    // 打开日志文件
    infoLog, err := os.OpenFile(infoFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
    if err != nil {
        return nil, err
    }
    errorLog, err := os.OpenFile(errorFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
    if err != nil {
        infoLog.Close()
        return nil, err
    }

    return &Logger{
        Info:  log.New(infoLog, "INFO: ", log.Ldate|log.Ltime|log.Lshortfile),
        Error: log.New(errorLog, "ERROR: ", log.Ldate|log.Ltime|log.Lshortfile),
    }, nil
}

func main() {
    logger, err := NewLogger("info.log", "error.log")
    if err != nil {
        log.Fatalf("无法创建日志记录器: %v", err)
    }

    logger.Info.Println("服务启动成功")
    logger.Error.Println("数据库连接失败:超时")
}

输出示例:

  • info.log 文件:
INFO: 2024/12/09 12:00:00 main.go:30: 服务启动成功
  • error.log 文件:
ERROR: 2024/12/09 12:00:00 main.go:31: 数据库连接失败:超时

总结

  • log 包提供了基础的日志记录功能,适合简单的日志需求。
  • 通过 log.New 和 log.SetOutput,可以实现更灵活的日志记录方式。
  • 在企业中,通常需要将 log 包与日志管理系统(如 ELK、Fluentd)结合使用,实现更高级的日志处理。

代码案例

package _case

import (
	"log"
	"os"
)

func init() {
	log.SetFlags(log.Ldate | log.Ltime | log.Llongfile)
	log.SetOutput(os.Stderr)
}

func LogCase() {
	//log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
	log.Println("带有日期、时间和文件信息的日志:")
	a, b := -1, -11
	_, err := sum(a, b)
	if err != nil {
		log.Println(err)
		log.Fatal(err) // fatal 打印日志后会导致程序的退出
	}
}

到此这篇关于go中log包的实现示例的文章就介绍到这了,更多相关go log包 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Golang编写自定义IP限流中间件的方法详解

    Golang编写自定义IP限流中间件的方法详解

    这篇文章给大家详细的介绍了Golang编写自定义IP限流中间件的方法,文章通过代码实例介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2023-09-09
  • Go语言中读取命令参数的几种方法总结

    Go语言中读取命令参数的几种方法总结

    部署golang项目时难免要通过命令行来设置一些参数,那么在golang中如何操作命令行参数呢?那么下面这篇文章就来给大家介绍了关于Go语言中读取命令参数的几种方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起看看吧。
    2017-11-11
  • Go 中 time.After 可能导致的内存泄露问题解析

    Go 中 time.After 可能导致的内存泄露问题解析

    这篇文章主要介绍了Go 中 time.After 可能导致的内存泄露,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • go微服务PolarisMesh源码解析服务端启动流程

    go微服务PolarisMesh源码解析服务端启动流程

    这篇文章主要为大家介绍了go微服务PolarisMesh源码解析服务端启动流程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Go语言学习之接口使用的示例详解

    Go语言学习之接口使用的示例详解

    Go语言并没有类的定义,接口可以说Go语言最接近于类的实现方式,但是更轻量。本文将通过一些简单的示例和大家介绍下Go语言中接口的使用,感兴趣的可以学习一下
    2022-11-11
  • golang定时器Timer的用法和实现原理解析

    golang定时器Timer的用法和实现原理解析

    这篇文章主要介绍了golang定时器Ticker,本文主要来看一下Timer的用法和实现原理,需要的朋友可以参考以下内容
    2023-04-04
  • Golang Gob编码(gob包的使用详解)

    Golang Gob编码(gob包的使用详解)

    这篇文章主要介绍了Golang Gob编码(gob包的使用详解),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • Golang 基础面试题集锦

    Golang 基础面试题集锦

    这篇文章主要为大家介绍了Golang 基础面试题集锦,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Golang爬虫框架 colly的使用

    Golang爬虫框架 colly的使用

    本文主要介绍了Golang爬虫框架 colly的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Go 语言中关于接口的三个

    Go 语言中关于接口的三个

    这篇文章主要介绍了Go 语言中关于接口的三个"潜规则",本文通过实例代码相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06

最新评论