开源库入门教程 LogrusGo结构化日志库

2024年Go最全golang日志框架之logrus,0基础学Golang logrus的一个很致命的问题就是没有提供文件名和行号,这在大型项目中通过日志定位问题时有诸多不便。的调用者开始,到记录日志的生成代码之间,大概有8到11层左右,所有我们在hook中循环第8到11层调用栈应该可以找到日志记录的生产代码。logrus最令人心动的功能就是其可扩展的HOOK机制了,通过在初始化时为logrus添加hook,logrus可以实现各种扩展功能。函数可以返回当前goroutine调用栈中的文件名,行号,函数信息等,参数skip表示表示返回的栈帧的层次,0表示。进行日志本地文件分割。 阅读详情

前言

嘿,各位Gopher们!今天咱们来聊一个在Go项目中超级实用的东西 - 日志处理!说实话,一开始我也不太重视日志,直到有一次深夜排查线上问题,那叫一个痛苦啊(相信很多人都有过类似经历)。

好的日志系统对于任何一个正经的项目来说都是必不可少的。Go语言自带了基础的log包,但它太简单了,功能有限。这时候,Logrus这个库就闪亮登场了!它是Go语言最受欢迎的结构化日志库之一,被大量项目采用。

Logrus是什么?

Logrus是一个Go语言的结构化日志库,由sirupsen开发。它完全兼容标准库logger的接口,但提供了更多的功能和灵活性。什么是结构化日志?简单来说,就是把日志信息组织成结构化数据(通常是JSON格式),而不是普通的文本字符串。这样做有很多好处,尤其是在需要分析大量日志数据的时候。

Logrus的主要特点:

  • 完全兼容Go标准库的logger
  • 支持多种日志级别(Debug, Info, Warn, Error等)
  • 支持Field机制(这个超好用!!!)
  • 支持Hook功能,可以把日志发送到各种地方
  • 支持自定义Formatter
  • 线程安全

为什么要用Logrus?

标准库的log包虽然简单易用,但在实际项目中很快就会遇到瓶颈。比如:

  1. 没有日志级别 - 所有日志都是一个级别,不能区分严重程度
  2. 没有结构化支持 - 只能输出纯文本
  3. 没有Field支持 - 不能方便地添加上下文信息
  4. 扩展性有限 - 难以与其他系统集成

而Logrus解决了这些问题,让日志变得更加强大和有用。

安装Logrus

安装超级简单,一行命令搞定:

go get -u github.com/sirupsen/logrus

注意包名是github.com/sirupsen/logrus,而不是github.com/Sirupsen/logrus(之前有大小写问题导致的包路径变更,坑了不少人)。

Logrus基础使用

基本示例

先来看个最简单的例子:

package main

import (
    "github.com/sirupsen/logrus"
)

func main() {
    // 创建一个logger实例
    log := logrus.New()
    
    // 设置日志级别
    log.SetLevel(logrus.InfoLevel)
    
    // 输出不同级别的日志
    log.Debug("这条不会显示,因为级别设置为Info") // 不会显示
    log.Info("这是一条信息日志")
    log.Warn("这是一条警告日志")
    log.Error("这是一条错误日志")
    
    // 这会导致程序退出
    // log.Fatal("这是一条致命错误日志")
    
    // 这会导致panic
    // log.Panic("这是一条panic日志")
}

运行后,你会看到Info及以上级别的日志都被输出了,而Debug级别的日志被忽略了。

使用Fields添加上下文

Logrus最强大的功能之一就是Fields,它允许你为日志添加结构化的上下文信息:

package main

import (
    "github.com/sirupsen/logrus"
)

func main() {
    log := logrus.New()
    
    // 添加Fields
    log.WithFields(logrus.Fields{
        "user_id": 123456,
        "service": "payment",
        "method": "POST",
    }).Info("用户支付成功")
    
    // 也可以链式调用
    log.WithField("module", "api").
        WithField("request_id", "abc-123").
        Error("API请求失败")
}

这样,每条日志都会带上这些额外的字段,非常有利于日志分析和问题排查。

配置Logrus

Logrus提供了多种配置选项,让你可以根据需要定制日志行为。

设置日志格式

Logrus支持多种日志格式,默认是文本格式,但你也可以使用JSON格式:

package main

import (
    "github.com/sirupsen/logrus"
)

func main() {
    log := logrus.New()
    
    // 使用JSON格式
    log.SetFormatter(&logrus.JSONFormatter{})
    
    // 添加一些字段
    log.WithFields(logrus.Fields{
        "event": "server_start",
        "topic": "app_events",
        "key": 42,
    }).Info("应用启动")
}

输出会是JSON格式:

{"event":"server_start","key":42,"level":"info","msg":"应用启动","time":"2023-09-14T12:34:56+08:00","topic":"app_events"}

这种格式特别适合机器处理和日志分析系统。

设置输出目标

默认情况下,Logrus输出到标准错误(stderr),但你可以改变这个行为:

package main

import (
    "os"
    "github.com/sirupsen/logrus"
)

func main() {
    log := logrus.New()
    
    // 创建或打开日志文件
    file, err := os.OpenFile("application.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
    if err == nil {
        log.SetOutput(file)
    } else {
        log.Info("无法打开日志文件,使用默认stderr")
    }
    
    log.Info("这条日志会写入文件")
}

你甚至可以同时输出到多个目标,比如同时输出到文件和控制台:

package main

import (
    "io"
    "os"
    "github.com/sirupsen/logrus"
)

func main() {
    log := logrus.New()
    
    // 打开日志文件
    file, err := os.OpenFile("application.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
    if err != nil {
        log.Fatal("无法打开日志文件:", err)
    }
    
    // 同时输出到文件和stderr
    mw := io.MultiWriter(os.Stderr, file)
    log.SetOutput(mw)
    
    log.Info("这条日志会同时出现在控制台和文件中")
}

自定义日志格式

如果内置的格式不满足需求,你可以实现自己的Formatter:

package main

import (
    "fmt"
    "github.com/sirupsen/logrus"
)

// 自定义Formatter
type MyFormatter struct {
    // 可以添加一些配置选项
    TimestampFormat string
    Prefix          string
}

// Format实现Formatter接口
func (f *MyFormatter) Format(entry *logrus.Entry) ([]byte, error) {
    // 格式化时间
    timestamp := entry.Time.Format(f.TimestampFormat)
    
    // 构建日志字符串
    msg := fmt.Sprintf("%s [%s] %s%s: %s\n",
        timestamp,
        entry.Level.String(),
        f.Prefix,
        entry.Message,
        fieldsToString(entry.Data))
    
    return []byte(msg), nil
}

// 辅助函数,将fields转为字符串
func fieldsToString(fields logrus.Fields) string {
    if len(fields) == 0 {
        return ""
    }
    
    result := " {"
    first := true
    for k, v := range fields {
        if first {
            first = false
        } else {
            result += ", "
        }
        result += fmt.Sprintf("%s: %v", k, v)
    }
    result += "}"
    
    return result
}

func main() {
    log := logrus.New()
    
    // 使用自定义格式
    log.SetFormatter(&MyFormatter{
        TimestampFormat: "2006-01-02 15:04:05",
        Prefix: "[MyApp] ",
    })
    
    log.WithField("user", "admin").Info("用户登录")
}

实用技巧

全局Logger vs 实例Logger

Logrus提供了两种使用方式:

  1. 全局Logger(直接使用logrus包级函数)
  2. 实例Logger(创建logrus.Logger实例)

全局Logger用起来方便:

package main

import (
    "github.com/sirupsen/logrus"
)

func main() {
    // 使用全局Logger
    logrus.SetLevel(logrus.InfoLevel)
    logrus.SetFormatter(&logrus.JSONFormatter{})
    
    logrus.Info("这是全局logger")
    logrus.WithField("global", true).Warn("警告信息")
}

但在大型应用中,我更推荐使用实例Logger,这样可以为不同组件配置不同的日志行为:

package main

import (
    "os"
    "github.com/sirupsen/logrus"
)

var (
    // 应用日志
    appLog = logrus.New()
    // 访问日志
    accessLog = logrus.New()
)

func init() {
    // 配置应用日志
    appLog.SetFormatter(&logrus.JSONFormatter{})
    appFile, _ := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
    appLog.SetOutput(appFile)
    
    // 配置访问日志
    accessLog.SetFormatter(&logrus.TextFormatter{})
    accessFile, _ := os.OpenFile("access.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
    accessLog.SetOutput(accessFile)
}

func main() {
    appLog.Info("应用启动")
    
    // 模拟HTTP请求
    accessLog.WithFields(logrus.Fields{
        "method": "GET",
        "path": "/api/users",
        "status": 200,
        "duration": "5ms",
    }).Info("请求处理完成")
}

使用Hook扩展功能

Hook是Logrus的一个强大特性,允许你在日志写入时执行自定义逻辑:

package main

import (
    "fmt"
    "github.com/sirupsen/logrus"
)

// 自定义Hook
type MyHook struct {
    // 可以添加配置
}

// Levels定义Hook处理的日志级别
func (h *MyHook) Levels() []logrus.Level {
    return []logrus.Level{
        logrus.ErrorLevel,
        logrus.FatalLevel,
        logrus.PanicLevel,
    }
}

// Fire在日志事件触发时被调用
func (h *MyHook) Fire(entry *logrus.Entry) error {
    // 这里可以做任何事情,比如:
    // - 发送错误到监控系统
    // - 发送告警邮件
    // - 写入特殊的日志文件
    fmt.Printf("触发告警: %s\n", entry.Message)
    return nil
}

func main() {
    log := logrus.New()
    
    // 添加自定义Hook
    log.AddHook(&MyHook{})
    
    // 正常使用logger
    log.Info("这是普通信息")  // 不会触发Hook
    log.Error("发生错误")   // 会触发Hook
}

有很多第三方Hook可以集成常见的服务,如Sentry、Logstash、Slack等。

日志字段的最佳实践

好的日志字段设计可以大大提高日志的可用性:

package main

import (
    "github.com/sirupsen/logrus"
    "os"
    "time"
)

// 应用通用字段
var commonFields = logrus.Fields{
    "app": "my-awesome-app",
    "env": os.Getenv("GO_ENV"),
    "version": "1.0.0",
}

func main() {
    log := logrus.New()
    log.SetFormatter(&logrus.JSONFormatter{})
    
    // 创建带有通用字段的logger
    logger := log.WithFields(commonFields)
    
    // 处理请求的函数
    handleRequest := func(requestID string, userID int, path string) {
        // 每个请求的logger
        reqLogger := logger.WithFields(logrus.Fields{
            "request_id": requestID,
            "user_id": userID,
            "path": path,
        })
        
        reqLogger.Info("开始处理请求")
        
        // 模拟处理时间
        time.Sleep(200 * time.Millisecond)
        
        // 记录结果
        reqLogger.WithFields(logrus.Fields{
            "status": 200,
            "duration_ms": 200,
            "response_size": 1024,
        }).Info("请求处理完成")
    }
    
    // 模拟几个请求
    handleRequest("req-123", 1001, "/api/users")
    handleRequest("req-456", 1002, "/api/products")
}

在这个例子中,我们构建了一个层次化的字段结构:

  1. 通用应用字段(app, env, version)
  2. 请求级别字段(request_id, user_id, path)
  3. 事件特定字段(status, duration_ms, response_size)

这种结构使得日志分析变得更加容易和有效。

Logrus的高级应用

集成到Web应用

在Web应用中,通常需要为每个请求记录日志。下面是与标准库http集成的例子:

package main

import (
    "github.com/sirupsen/logrus"
    "net/http"
    "time"
)

// LoggingMiddleware 是一个简单的日志中间件
func LoggingMiddleware(log *logrus.Logger) func(http.Handler) http.Handler {
    return func(next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            // 请求开始时间
            start := time.Now()
            
            // 包装ResponseWriter以捕获状态码
            wrapped := wrapResponseWriter(w)
            
            // 处理请求
            next.ServeHTTP(wrapped, r)
            
            // 计算持续时间
            duration := time.Since(start)
            
            // 记录请求日志
            log.WithFields(logrus.Fields{
                "remote_addr": r.RemoteAddr,
                "method": r.Method,
                "path": r.URL.Path,
                "status": wrapped.status,
                "user_agent": r.UserAgent(),
                "duration_ms": duration.Milliseconds(),
            }).Info("HTTP请求")
        })
    }
}

// responseWriter是http.ResponseWriter的包装
type responseWriter struct {
    http.ResponseWriter
    status int
}

func wrapResponseWriter(w http.ResponseWriter) *responseWriter {
    return &responseWriter{w, http.StatusOK}
}

func (rw *responseWriter) WriteHeader(code int) {
    rw.status = code
    rw.ResponseWriter.WriteHeader(code)
}

func main() {
    // 创建logger
    log := logrus.New()
    log.SetFormatter(&logrus.JSONFormatter{})
    
    // 创建http handler
    helloHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("Hello, World!"))
    })
    
    // 应用中间件
    http.Handle("/", LoggingMiddleware(log)(helloHandler))
    
    // 启动服务器
    log.Info("服务器启动在 :8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

日志轮转

在生产环境中,通常需要进行日志轮转(log rotation),以防止日志文件过大。可以使用第三方库(如lumberjack)与Logrus集成:

package main

import (
    "github.com/sirupsen/logrus"
    "gopkg.in/natefinch/lumberjack.v2"
)

func main() {
    // 创建logger
    log := logrus.New()
    
    // 配置lumberjack进行日志轮转
    logRotator := &lumberjack.Logger{
        Filename:   "app.log",
        MaxSize:    10,   // 单位是MB
        MaxBackups: 5,    // 保留的旧日志文件数量
        MaxAge:     30,   // 保留天数
        Compress:   true, // 是否压缩旧日志
    }
    
    // 设置输出
    log.SetOutput(logRotator)
    log.SetFormatter(&logrus.JSONFormatter{})
    
    // 写一些日志
    for i := 0; i < 100; i++ {
        log.WithField("iteration", i).Info("这是一条测试日志")
    }
}

常见问题与解决方案

性能考虑

在高性能场景下,日志可能成为瓶颈。一些提升性能的技巧:

  1. 谨慎使用Debug级别日志,生产环境中可以关闭
  2. 使用异步日志(通过自定义Writer或Hook实现)
  3. 避免不必要的字段和操作

日志安全

记住,日志中不应该包含敏感信息:

// 错误示范
log.WithField("password", userPassword).Info("用户登录")

// 正确做法
log.WithField("has_password", userPassword != "").Info("用户登录")

对于需要脱敏的字段,可以创建自定义Hook进行处理。

结语

Logrus是Go语言中非常优秀的日志库,它提供了强大的功能和灵活性,适合各种规模的项目。掌握了本文介绍的技巧,你就能在项目中建立一个优秀的日志系统,让问题排查和监控变得更加容易。

记住,好的日志不是事后才想起来的事情,而是应该在项目初期就认真设计和实施的基础设施。希望这篇教程对你有所帮助!

当然,Logrus并不是唯一的选择。如果你对性能有更高的要求,可以考虑Zap或Zerolog等库。但作为入门和大多数项目,Logrus都是一个不错的选择。

接下来,就动手实践吧!相信很快你就能体会到良好日志系统带来的便利。

Golang log日志框架logrus logrus是目前Github上star数量最多的日志库。logrus功能强大,性能高效,而且具有高度灵活性,logrus是一个可插拔的、结构化的日志框架,提供了自定义插件的功能。很多开源项目,如docker,prometheus等,都是用了logrus来记录其日志。 阅读详情

相关推荐

基于决策树的英雄联盟比赛胜负预测(含完整代码)

在代码中设置随机种子(例如 RANDOM_SEED = 2024)的主要目的是为了确保每次运行代码时,随机过程的结果是一致的。通过绘制不同参数组合下的准确率图,直观地展示了参数对模型性能的影响,帮助读者更好地理解和选择合适的参数。通过设置相同的随机种子(伪随机数),可以确保每次运行代码时,随机数生成器生成的随机数序列是相同的。如果在开发过程中遇到问题,设置固定的随机种子可以帮助你更容易地定位问题,因为每次运行代码时的数据和结果都是一样的。在科学研究和实验中,结果的可重复性是非常重要的。

oisflo的博客 1919

Go日志库——logrus

go日志库学习-logrus

成长之路 4378

Claude Code 接入 DeepSeek-V4 教程

本文介绍Claude Code的安装配置流程:1) 安装Node.js 18+和Git(Windows);2) 通过npm全局安装@anthropic-ai/claude-code;3) 配置DeepSeek API环境变量(需替换API Key);4) 启动Claude Code或配置VSCode插件。重点包括Linux/macOS和Windows的环境变量设置方法,以及VSCode插件的settings.json配置项。完成配置后即可在终端或VSCode中使用Claude Code功能。

培根芝士的专栏 2002

Golang logrus 快速上手

这个包有几个函数:Print、Printf、Println、Fatal、Fatalf、Fatalln、Panic、Panicf、Panicln,可以满足大部分日志的打印和处理需求。zap是Uber开源的一款高性能日志库,它支持多种日志级别和输出方式,包括console、json、file等等。在实际开发过程中,为了节省磁盘和方便查看,日志需要按照时间或者大小维度进行切割分成多分归档过期的日志,删除久远的日志.这个就是在日常开发中经常遇见的日志滚动(log rotation)。

Doublelv 的博客专栏。 4405

黑马程序员Pink的javaScript课程APIday4

本文摘要:介绍了JavaScript中日期对象的实例化方法(有参/无参)及三种获取时间戳的方式。讲解了DOM节点操作,包括节点查找(父、子、兄弟节点)、增加/克隆/删除节点的方法。详细说明了移动端touch事件和Swiper插件的使用,包括自动播放和小圆点配置。最后提及学成在线案例中表单验证和取消默认跳转的实现。

JLY19970726的博客 825

Agent 团队管理手册:如何设定目标、分配角色与解决冲突

本文从Agent团队的底层逻辑出发,完整讲解了Agent团队管理的三大核心模块:目标设定(分层拆解+对齐校验)、角色分配(能力匹配+最优算法)、冲突处理(分类处理+仲裁投票),并提供了可直接运行的完整代码示例。通过本文的方法,你可以快速搭建一个高效协作的Agent团队,大幅提升复杂任务的完成效率和准确率。Agent团队是未来AI应用的核心形态,现在正是落地的黄金期,建议你从一个小场景开始动手实践,逐步优化自己的Agent团队管理方法论。

AI天才研究院 232

golang日志框架之logrus

本文转载自姜总 golang日志库 golang标准库的日志框架非常简单,仅仅提供了print,panic和fatal三个函数对于更精细的日志级别、日志文件分割以及日志分发等方面并没有提供支持。所以催生了很多第三方的日志库,但是在golang的世界里,没有一个日志库像slf4j那样在Java中具有绝对统治地位。golang中,流行的日志框架包括logrus、zap、zerolog、seelog...

jacklife的博客 8万+

[RK3568 Android12] 添加自定义启动脚本

1:定义添加的脚本 2:rk3568_s.mk 中定义打包 3:在启动脚本中init.rk356x.rc添加权限及何时启动 4:添加权限文件file_contexts 5:系统确认是否运行

OpenWrt/WLAN/驱动/Android/嵌入式开发总结 2219

Go语言日志库logrus

Go语言日志库logrus

YIYIYI 2136

c++中,部署Ethercat IGH + PREEMPT_RT 环境,跑DC模式,如何实现?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1355

AI上推荐 之 AutoRec与Deep Crossing模型(改变神经网络的复杂程度)

1. 前言 随着信息技术和互联网的发展, 我们已经步入了一个信息过载的时代,这个时代,无论是信息消费者还是信息生产者都遇到了很大的挑战: 信息消费者:如何从大量的信息中找到自己感兴趣的信息? 信息生产者:如何让自己生产的信息脱颖而出, 受到广大用户的关注? 为了解决这个矛盾, 推荐系统应时而生, 并飞速前进,在用户和信息之间架起了一道桥梁,一方面帮助用户发现对自己有价值的信息, 一方面让信息能够展现在对它感兴趣的用户前面。 推荐系统近几年有了深度学习的助推发展之势迅猛, 从前深度学习的传统推荐模型(协

Miracle8070 5664

【Golang】关于Go中logrus的用法

一、标准日志库log 在日常开发中,日志是必不可少的功能。虽然有时可以用fmt库输出一些信息,但是灵活性不够。Go 标准库提供了一个日志库log。 1、快速使用 log是 Go 标准库提供的,不需要另外安装 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

Ch3nnn的博客 5291

【光伏风电功率预测】偏差考核每月少几十万:STL-VMD + Informer-LSTM 在某基地的落地案例

摘要:某风光一体化基地通过STL-VMD二次分解与Informer-LSTM并行残差模型,在不推翻现有预测系统的情况下,将风光功率预测的综合nRMSE降低了1.2-1.5个百分点。该方案通过分解预测误差为多个子序列,并采用不同模型处理各频段特征,显著改善了关键时段的预测精度。实施后,风电nRMSE从9.0%降至7.6%,光伏从10.2%降至8.8%,每月减少偏差考核费用30-50万元。项目经验表明,数据质量优化、参数调优及与业务目标对齐是关键成功因素,该技术路线具有可复制性,为风光基地预测精度提升提供了有效

专注AI大模型,软件混淆,授权 263

go日志库log/zap/logrus

logrus 默认的logger在并发写的时候是被mutex保护的,比如当同时调用hook和写log时mutex就会被请求,有另外一种情况,文件是以appending mode打开的, 此时的并发操作就是安全的,可以用logger.SetNoLock()来关闭它。其中,通过r.Use(logger.GinLogger(), logger.GinRecovery(true))注册中间件来使用zap接收gin框架自身的日志,在项目中需要的地方通过使用zap.L().Xxx()方法来记录自定义日志信息。

General_zy的博客 4644

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Logrus日志框架:简介与入门指南

Logrus是一个流行的Go语言日志库,提供了丰富的日志输出和格式化功能。它被广泛应用于Go语言项目中,用于记录程序的运行状态、错误信息和调试信息等。

赵士杰——成功并非一蹴而就,而是在持之以恒的努力中逐渐实现。 958

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Go开源日志库Logrus的使用

简介go开源日志框架logrus,及其使用方法

longchanghua_enshi的专栏 2597

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

[中间件]日志框架Logrus

Logrus 允许通过实现Formatter接口来自定义日志格式。import ("fmt""time"Logrus 作为 Go 语言中一款优秀的日志库,凭借结构化日志、多级日志级别、高度可扩展性和高效性能等特性,为开发者提供了强大且灵活的日志管理解决方案。

weixin_43371866的博客 1119

golang日志框架之logrus详细说明

前面的话 下面示例代码中的一些import我没做校验,我只是从我的一个测试代码里抠出来的,出现一些错误自己简单处理下就可以用。 logrus简介 logrus是一个可插拔的、结构化的日志框架。 logrus拥有六种日志级别:debug、info、warn、error、fatal和panic 可扩展的Hook机制: 允许使用者通过hook的方式将日志分发到任意地方,如本地文件系统、标准输出、logs...

Salted fish in hand, I have the world. 7963

go语言日志框架——logrus

go日志输出工具logrus

尚墨1111的博客 4974

Go最全Go日志库——logrus(1),Golang开发指南

通常,在一个应用中、或者应用的一部分中,始终附带一些固定的记录字段会很有帮助。比如在处理用户HTTP请求时,上下文中所有的日志都会有request_id。为了避免每次记录日志都要使用:我们可以创建一个logrus.Entry实例,为这个实例设置默认Fields,把logrus.Entry实例设置到记录器Logger,再记录日志时每次都会附带上这些默认的字段。logger.Info(“something happened on that request”) // 也会记录request_id。

2401_84905102的博客 1368

Golang日志库logrus的介绍与使用

Logrus 是一个流行的 Go 语言日志库,它提供了结构化日志和多种日志级别的功能。Logrus 非常灵活,支持自定义日志格式和输出,被许多 Go 语言项目广泛使用

m0_70982551的博客 1483

go入门实践三-go日志库-Logrus入门教程

go日志库-Logrus入门教程

大草的博客 1485

2024年Go最全Go日志库——logrus,Golang原生开发如何深入进阶

【代码】2024年Go最全Go日志库——logrus,Golang原生开发如何深入进阶。

2401_84920041的博客 641

每日一库系列01 go的logrus库介绍

有时候需要在输出中添加一些字段,可以通过调用和实现。接受一个类型的参数,其底层实际上为"age": 18,})实际上,WithFields返回一个类型的值,它将和设置的保存下来。调用Entry相关方法输出日志时,保存下来的也会随之输出。Hook: 接口,需实现Levels()和Fire()方法。Levels()方法返回感兴趣的日志级别,输出其他日志时不会触发钩子。Fire是日志输出前调用的钩子方法。LevelHooks: 这是一个类型别名,表示一个映射,键是日志级别,值是一个包含多个钩子的切片。

m0_73358879的博客 849

第三方日志库logrus使用

日志是程序中必不可少的一个环节,由于Go语言内置的日志库功能比较简洁,我们在实际开发中通常会选择使用第三方的日志库来进行开发。本文介绍了logrus这个日志库的基本使用。 logrus介绍 Logrus是Go(golang)的结构化logger,与标准库logger完全API兼容。 它有以下特点: 完全兼容标准日志库,拥有七种日志级别:Trace,Debug,Info,Warning,Error,FatalandPanic。 可扩展的Hook机制,允许使用者通过Hook的方式将日志分发...

用于记录学习的过程,不做商业用途。 1703
上一篇: RocketRust Web框架入门教程
下一篇: qdrantqdrant:星标3.1万的开源向量搜索引擎
普通网友
博客等级 码龄1年 17粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值