• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    golang 日志log与logrus示例详解

    发布者: 怀卉1097 | 发布时间: 2025-8-14 12:24| 查看数: 13| 评论数: 0|帖子模式

    一、Go 标准库 log 详解



    1. 功能特点
    1. log
    复制代码
    是 Go 语言标准库中一个简单的日志库,主要功能包括:

    • 写入日志到指定位置(默认为标准错误)
    • 支持_FATAL 和 _ERROR 等级别的日志
    • 支持格式化日志输出

    2. 常用函数
    1. log
    复制代码
    包中常用的函数如下:
    函数名功能log.Print输出日志log.Printf格式化输出日志log.Println输出日志,自动换行log.Fatal输出日志并调用 os.Exit(1)log.Fatalf格式化输出日志并退出log.Panic输出日志并引发 paniclog.Panicln格式化输出日志并引发 paniclog.SetFlags设置日志格式(日期、时间等)log.SetOutput设置日志输出目标

    3. 示例代码
    1. package main  
    2. import (  
    3.     "log"  
    4.     "os"  
    5. )  
    6. func main() {  
    7.     // 1. 默认输出到标准错误  
    8.     log.Println("这是一条普通日志")  
    9.     // 2. 格式化输出  
    10.     name := "Alice"  
    11.     age := 30  
    12.     log.Printf("用户 %s 已经 %d 岁了\n", name, age)  
    13.     // 3. 设置日志输出目标为文件  
    14.     file, err := os.OpenFile("log.txt", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)  
    15.     if err != nil {  
    16.         log.Fatal(err)  
    17.     }  
    18.     log.SetOutput(file)  
    19.     log.Println("日志已切换到文件输出")  
    20.     // 4. 设置日志格式(默认包含时间信息)  
    21.     log.SetFlags(log.LstdFlags)  
    22.     //Ldate         = 1 << iota     // 使用本地时区的日期:2009/01/23
    23.         //Ltime                         // 使用本地时区的时间:01:23:23
    24.         //Lmicroseconds                 // 微秒精度的时间:01:23:23.123123。假设启用了Ltime
    25.         //Llongfile                     // 完整文件名和行号:/a/b/c/d.go:23
    26.         //Lshortfile                    // 文件名的最后一部分和行号:d.go:23。覆盖Llongfile
    27.         //LUTC                          // 如果设置了Ldate或Ltime,则使用UTC而不是本地时区
    28.         //Lmsgprefix                    // 将“前缀”从行首移动到消息之前
    29.         //LstdFlags     = Ldate | Ltime // 标准logger的初始值,包含日期和时间
    30.     log.Println("这是一条包含时间的日志")  
    31.     log.Panic("Panic\n")
    32.         //log.Fatal("Fatal\n")
    33. }  
    复制代码
    4. 优势和局限

    优势

    • 内置库,使用简单,不需要额外依赖。
    • 支持基本的日志输出和格式化。
    局限

    • 功能较简单,不支持多日志级别(如 DEBUG、INFO、WARNING 等)。
    • 不支持 JSON 格式化输出。
    • 不支持日志轮转(logrotate)。

    二、第三方库 logrus 详解

    1. 功能特点
    1. logrus
    复制代码
    是 Go 语言中一个功能强大的日志库,主要特点如下:

    • 支持多种日志级别:
      1. Debug
      复制代码
      1. Info
      复制代码
      1. Warning
      复制代码
      1. Error
      复制代码
      1. Fatal
      复制代码
      1. Panic
      复制代码
    • 支持两种输出格式:
      1. text
      复制代码
      1. json
      复制代码
    • 支持日志轮转(结合
      1. lumberjack
      复制代码
      包)
    • 支持钩子(Hooks)机制,扩展日志处理逻辑
    • 支持多种输出目标(文件、网络、console 等)

    2. 核心功能

    以下是
    1. logrus
    复制代码
    的核心功能:
              1 .多日志级别
    1. logger.Debug("调试日志")  
    2. logger.Info("信息日志")  
    3. logger.Warn("警告日志")  
    4. logger.Error("错误日志")  
    5. logger.Fatal("致命错误")  
    6. logger.Panic("panic 日志")  
    复制代码
            2. 格式化输出
    1. logger.WithFields(logrus.Fields{  
    2.     "username": "Alice",  
    3.     "age":       30,  
    4. }).Info("用户信息")  
    复制代码
            3. 切换输出格式
    1. // 切换到 JSON 格式  
    2. logger.SetFormatter(&logrus.JSONFormatter{})  
    3. // 配置日志格式为 text(默认)
    4. //logger.SetFormatter(&logrus.TextFormatter{})
    复制代码
            4.设置日志输出目标
    1. logger.SetOutput(os.Stdout) // 输出到标准输出  
    复制代码
            5. 日志轮转(结合 lumberjack)
    1. // 须import(
    2.     lumberjack "gopkg.in/natefinch/lumberjack.v2"
    3. )
    4. writer := &lumberjack.Logger{  
    5.     Filename:   "logs/app.log",  
    6.     MaxSize:     500, // MB  
    7.     MaxBackups:  3,  
    8.     MaxAge:      28, // days  
    9.     Compress:   true,  
    10. }  
    11. logger.SetOutput(writer)  
    复制代码
    3. 示例代码

    以下是一个完整的
    1. logrus
    复制代码
    示例代码,包含日志级别、格式化、文件轮转和钩子功能:
    1. package main  
    2. import (  
    3.     "log"  
    4.     "os"  
    5.     "os/signal"  
    6.     "syscall"  
    7.     "time"  
    8.     lumberjack "gopkg.in/natefinch/lumberjack.v2"
    9.     "github.com/sirupsen/logrus"  
    10. )  
    11. func main() {  
    12.     // 1. 创建 logger 实例  
    13.     logger := logrus.New()  
    14.     // 2. 配置日志级别  
    15.     logger.SetLevel(logrus.InfoLevel)  
    16.     // 3. 配置日志格式为 JSON  
    17.     logger.SetFormatter(&logrus.JSONFormatter{})  
    18.     // 4. 配置日志轮转  
    19.     writer := &lumberjack.Logger{  
    20.         Filename:   "logs/app.log",  
    21.         MaxSize:     500, // MB  
    22.         MaxBackups:  3,  
    23.         MaxAge:      28, // days  
    24.         Compress:   true,  
    25.     }  
    26.     logger.SetOutput(writer)  
    27.     // 5. 添加钩子(Hook)  
    28.     logger.AddHook(&MyHook{})  
    29.     // 6. 写入日志  
    30.     logger.Info("这是一个 Info 级别的日志")  
    31.     // 7. 带字段的日志  
    32.     logger.WithFields(logrus.Fields{  
    33.         "username": "Bob",  
    34.         "age":      25,  
    35.     }).Error("用户未找到")  
    36.     // 8. 处理信号  
    37.     signalChan := make(chan os.Signal, 1)  
    38.     signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM)  
    39.     go func() {  
    40.         <-signalChan  
    41.         logger.Info("程序已优雅退出")  
    42.         os.Exit(0)  
    43.     }()  
    44. }  
    45. // 自定义钩子示例  
    46. type MyHook struct{}  
    47. func (*MyHook) Levels() []logrus.Level {  
    48.     return []logrus.Level{  
    49.         logrus.InfoLevel,  
    50.         logrus.ErrorLevel,  
    51.     }  
    52. }  
    53. func (*MyHook) Fire(entry *logrus.Entry) error {  
    54.     // 钩子逻辑:例如发送日志到远程服务器  
    55.     log.Printf("钩子处理:%+v\n", entry)  
    56.     return nil  
    57. }  
    复制代码
    4. 优势和扩展性


    • 优势

      • 功能强大,支持多日志级别和格式化。
      • 高度可定制,支持钩子机制和多种输出目标。
      • 社区生态丰富,广泛应用于生产环境。

    • 扩展性

      • 支持第三方库扩展(如日志轮转、网络输出等)。


    三、总结

    1. 何时选择
    1. log
    复制代码


    • 当项目的日志需求简单(只需要基本的日志输出)。
    • 项目不希望引入额外的依赖。
    2. 何时选择
    1. logrus
    复制代码


    • 项目需要多日志级别和格式化输出。
    • 需要更高的可定制性和扩展性。
    • 需要支持日志轮转和钩子机制。
    3. 对比总结
    特性loglogrus日志级别有限(Fatal、Error)多级别(Debug~Panic)格式化输出支持支持(Text/JSON)日志轮转不支持支持(需配合 lumberjack)钩子机制不支持支持输出目标标准输出/文件多种(文件、网络等)社区和扩展性内置库第三方库,社区丰富到此这篇关于golang 日志log与logrus的文章就介绍到这了,更多相关golang 日志log与logrus内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    来源:互联网
    免责声明:如果侵犯了您的权益,请联系站长(1277306191@qq.com),我们会及时删除侵权内容,谢谢合作!

    最新评论

    浏览过的版块

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表