golang 日志log与logrus
目录
一、Go 标准库 log 详解
1. 功能特点
2. 常用函数
3. 示例代码
4. 优势和局限
二、第三方库 logrus 详解
1. 功能特点
2. 核心功能
3. 示例代码
4. 优势和扩展性
三、总结
1. 何时选择 log?
2. 何时选择 logrus?
3. 对比总结
一、Go 标准库 log 详解
1. 功能特点
log 是 Go 语言标准库中一个简单的日志库,主要功能包括:
- 写入日志到指定位置(默认为标准错误)
- 支持_FATAL 和 _ERROR 等级别的日志
- 支持格式化日志输出
2. 常用函数
log 包中常用的函数如下:
| 函数名 | 功能 |
|---|---|
| log.Print | 输出日志 |
| log.Printf | 格式化输出日志 |
| log.Println | 输出日志,自动换行 |
| log.Fatal | 输出日志并调用 os.Exit(1) |
| log.Fatalf | 格式化输出日志并退出 |
| log.Panic | 输出日志并引发 panic |
| log.Panicln | 格式化输出日志并引发 panic |
| log.SetFlags | 设置日志格式(日期、时间等) |
| log.SetOutput | 设置日志输出目标 |
3. 示例代码
package main import ( "log" "os"
) func main() { // 1. 默认输出到标准错误 log.Println("这是一条普通日志") // 2. 格式化输出 name := "Alice" age := 30 log.Printf("用户 %s 已经 %d 岁了\n", name, age) // 3. 设置日志输出目标为文件 file, err := os.OpenFile("log.txt", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644) if err != nil { log.Fatal(err) } log.SetOutput(file) log.Println("日志已切换到文件输出") // 4. 设置日志格式(默认包含时间信息) log.SetFlags(log.LstdFlags) //Ldate = 1 << iota // 使用本地时区的日期:2009/01/23//Ltime // 使用本地时区的时间:01:23:23//Lmicroseconds // 微秒精度的时间:01:23:23.123123。假设启用了Ltime//Llongfile // 完整文件名和行号:/a/b/c/d.go:23//Lshortfile // 文件名的最后一部分和行号:d.go:23。覆盖Llongfile//LUTC // 如果设置了Ldate或Ltime,则使用UTC而不是本地时区//Lmsgprefix // 将“前缀”从行首移动到消息之前//LstdFlags = Ldate | Ltime // 标准logger的初始值,包含日期和时间log.Println("这是一条包含时间的日志") log.Panic("Panic\n")//log.Fatal("Fatal\n")
}
4. 优势和局限
- 优势:
- 内置库,使用简单,不需要额外依赖。
- 支持基本的日志输出和格式化。
- 局限:
- 功能较简单,不支持多日志级别(如 DEBUG、INFO、WARNING 等)。
- 不支持 JSON 格式化输出。
- 不支持日志轮转(logrotate)。
二、第三方库 logrus 详解
1. 功能特点
logrus 是 Go 语言中一个功能强大的日志库,主要特点如下:
- 支持多种日志级别:
Debug、Info、Warning、Error、Fatal、Panic - 支持两种输出格式:
text和json - 支持日志轮转(结合
lumberjack包) - 支持钩子(Hooks)机制,扩展日志处理逻辑
- 支持多种输出目标(文件、网络、console 等)
2. 核心功能
以下是 logrus 的核心功能:
1 .多日志级别
logger.Debug("调试日志")
logger.Info("信息日志")
logger.Warn("警告日志")
logger.Error("错误日志")
logger.Fatal("致命错误")
logger.Panic("panic 日志")
2. 格式化输出
logger.WithFields(logrus.Fields{ "username": "Alice", "age": 30,
}).Info("用户信息")
3. 切换输出格式
// 切换到 JSON 格式
logger.SetFormatter(&logrus.JSONFormatter{})
// 配置日志格式为 text(默认)
//logger.SetFormatter(&logrus.TextFormatter{})
4.设置日志输出目标
logger.SetOutput(os.Stdout) // 输出到标准输出
5. 日志轮转(结合 lumberjack)
// 须import(lumberjack "gopkg.in/natefinch/lumberjack.v2"
)
writer := &lumberjack.Logger{ Filename: "logs/app.log", MaxSize: 500, // MB MaxBackups: 3, MaxAge: 28, // days Compress: true,
}
logger.SetOutput(writer)
3. 示例代码
以下是一个完整的 logrus 示例代码,包含日志级别、格式化、文件轮转和钩子功能:
package main import ( "log" "os" "os/signal" "syscall" "time" lumberjack "gopkg.in/natefinch/lumberjack.v2" "github.com/sirupsen/logrus"
) func main() { // 1. 创建 logger 实例 logger := logrus.New() // 2. 配置日志级别 logger.SetLevel(logrus.InfoLevel) // 3. 配置日志格式为 JSON logger.SetFormatter(&logrus.JSONFormatter{}) // 4. 配置日志轮转 writer := &lumberjack.Logger{ Filename: "logs/app.log", MaxSize: 500, // MB MaxBackups: 3, MaxAge: 28, // days Compress: true, } logger.SetOutput(writer) // 5. 添加钩子(Hook) logger.AddHook(&MyHook{}) // 6. 写入日志 logger.Info("这是一个 Info 级别的日志") // 7. 带字段的日志 logger.WithFields(logrus.Fields{ "username": "Bob", "age": 25, }).Error("用户未找到") // 8. 处理信号 signalChan := make(chan os.Signal, 1) signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM) go func() { <-signalChan logger.Info("程序已优雅退出") os.Exit(0) }()
} // 自定义钩子示例
type MyHook struct{} func (*MyHook) Levels() []logrus.Level { return []logrus.Level{ logrus.InfoLevel, logrus.ErrorLevel, }
} func (*MyHook) Fire(entry *logrus.Entry) error { // 钩子逻辑:例如发送日志到远程服务器 log.Printf("钩子处理:%+v\n", entry) return nil
}
4. 优势和扩展性
- 优势:
- 功能强大,支持多日志级别和格式化。
- 高度可定制,支持钩子机制和多种输出目标。
- 社区生态丰富,广泛应用于生产环境。
- 扩展性:
- 支持第三方库扩展(如日志轮转、网络输出等)。
三、总结
1. 何时选择 log?
- 当项目的日志需求简单(只需要基本的日志输出)。
- 项目不希望引入额外的依赖。
2. 何时选择 logrus?
- 项目需要多日志级别和格式化输出。
- 需要更高的可定制性和扩展性。
- 需要支持日志轮转和钩子机制。
3. 对比总结
| 特性 | log | logrus |
|---|---|---|
| 日志级别 | 有限(Fatal、Error) | 多级别(Debug~Panic) |
| 格式化输出 | 支持 | 支持(Text/JSON) |
| 日志轮转 | 不支持 | 支持(需配合 lumberjack) |
| 钩子机制 | 不支持 | 支持 |
| 输出目标 | 标准输出/文件 | 多种(文件、网络等) |
| 社区和扩展性 | 内置库 | 第三方库,社区丰富 |
相关文章:
golang 日志log与logrus
目录 一、Go 标准库 log 详解 1. 功能特点 2. 常用函数 3. 示例代码 4. 优势和局限 二、第三方库 logrus 详解 1. 功能特点 2. 核心功能 3. 示例代码 4. 优势和扩展性 三、总结 1. 何时选择 log? 2. 何时选择 logrus? 3. 对比总结 一、Go 标…...
EFISH-SBC-RK3576 + 5G模组:无线工业相机与分布式AI质检
在智能制造与仓储物流场景中,传统有线工业相机存在部署成本高、灵活性差等痛点。eFish-SBC-RK3576 通过 5G无线传输 分布式NPU协同,实现跨产线、跨工厂的AI质检系统,检测效率提升300%,布线复杂度降低90%。 1. 系统架构…...
C/C++ 基础 - 回调函数
目录 前言 回调函数预备知识 函数指针 什么是函数指针 函数指针的语法 如何用函数指针调用函数 函数指针作为函数的参数 函数指针作为函数返回类型 函数指针数组 回调函数 什么是回调函数 为什么要用回调函数 怎么使用回调函数 总结 前言 在写项目的时候&#x…...
【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的消息队列:使用 RabbitMQ 实现异步处
<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、开篇整…...
高项第十六章——项目采购管理
什么是采购管理?项目采购管理包括从项目团队外部采购或获取所需产品、服务或成果的各个过程。 项目采购管理包括编制和管理协议所需的管理和控制过程。 16_1 管理基础 什么是协议?协议是用于明确项目初步意向的任何文件或沟通结果,协议的范…...
宽带的带宽
宽带的带宽是指在一定时间内通过网络连接传输数据的能力,通常用**比特率(bit/s,即每秒传输的比特数)**来表示,比如100Mbps(兆比特每秒)。带宽越大,理论上网络传输数据的速度越快&…...
DeepSeek分析仿写选题应该怎么做?
目录 选题分析:AIGC在学术写作中的应用及其与作者背景的关系 1. 选题背景与意义 2. 研究问题 3. 研究方法 4. 主要发现 5. 研究贡献 6. 研究局限与未来方向 7. 结论 8. 未来研究方向 大家好这里是AIWritePaper官方账号,官网👉AIWrit…...
19840 Dijkstra求最短路2
19840 Dijkstra求最短路2 相较于1,数据增强了,要用堆来优化,也就是优先队列。 ⭐️难度:中等 🌟考点:Dijkstra、最短路问题 📖 📚 import java.util.*;public class Main {static…...
docker-compose部署prometheus+grafana+node_exporter
目录 docker-compose文件 配置文件 文件层级关系,docker-compose和配置文件位于同级目录 node_exporter页面json文件 涉及离线包 一.docker-compose文件 [rootsulibao prometheus]# cat docker-compose.yml version: 3services:prometheus:image: registry.c…...
Oracle数据库数据编程SQL<递归函数详解>
递归函数是一种在函数体内直接或间接调用自身的函数。这种函数通过将复杂问题分解为更小的相同问题来解决特定类型的编程任务。 目录 一、递归函数基本概念 1. 递归定义 2. 递归工作原理 二、递归函数示例 1. 经典阶乘函数 2. 斐波那契数列 3. 计算数字位数 三、递归查…...
Redis-08.Redis常用命令-有序集合操作命令
一.有序集合操作命令 ZADD key score 1 member1 [score2 member2]: zadd zset 10.0 a 10.5 b ZRANGE key start stop [WITHSCORES]: zrange zset 0 -1 为何顺序为a,c,b? 因为 zrange zset 0 -1 withscores zrange key start …...
LLaMA-Factory使用实战
LLaMA-Factory使用实战 项目介绍 项目地址:https://github.com/hiyouga/LLaMA-Factory 中文文档:安装 - LLaMA Factory 快速开始文档:https://zhuanlan.zhihu.com/p/695287607(推荐参考) 远程服务器通过本地代理加…...
读一本书,骑行万里路:与维乐 Angel Rise+骑行看世界
最近读到了一本名为《自行车改变的世界:女性骑行的历史》的书,才发现原来女性的骑行自由来得并不轻易,激励着每一位女性勇敢地踏上骑行之路。而我一直在使用的维乐坐垫品牌,除了产品专业之外,也一直都非常关注女性骑行…...
【大模型】SpringBoot整合LangChain4j实现RAG检索实战详解
目录 一、前言 二、LangChain4j 介绍 2.1 什么是LangChain4j 2.2 LangChain4j 主要特点 2.3 Langchain4j 核心组件 三、RAG介绍 3.1 什么是RAG 3.2 RAG工作流程 3.2.1 补充说明 3.3 Embedding模型 3.3.1 RAG实际使用步骤 3.3.2 什么是Embedding 3.3.3 Embedding 技…...
流动的梦境:GPT-4o 的自回归图像生成深度解析
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
北大人工智能研究院朱松纯:“中国的AI叙事” 存在认知偏差
3月29日,在2025中关村论坛通用人工智能论坛上,北京通用人工智能学院院长,北京大学人工智能研究院、智能学院院长朱松纯表示,目前,行业对AI的讨论几乎被大模型能力所占据,而基础学科、原始创新与智能本质的研…...
习题1.26
解释题,说简单也简单,难在如何表达清楚。 首先解释下代码的变化 (defn expmod[base exp m](cond ( exp 0) 1(even? exp) (mod (square (expmod base (/ exp 2) m)) m):else (mod (* base (expmod base (- exp 1) m)) m)))(defn expmod[base exp m](co…...
FPGA调试笔记
XILINX SSTL属性电平报错 错误如下: [DRC BIVRU-1] Bank IO standard Vref utilization: Bank 33 contains ports that use a reference voltage. In order to use such standards in a bank that is not configured to use INTERNAL_VREF, the banks VREF pin mu…...
基于Java(SSM)+Mysql实现移动大厅业务办理(增删改查)
基于 SSM 框架的移动业务大厅 数据库需要自行创建! 一、 整体基本实现情况 对本学期的 Java 作业 1 的 SOSO 移动大厅进行改进, 基于 SSM、JSP、Maven、Tomcat、MySQL 等实现。 二、 实现详情 1、 工程结构图 2、 工程结构各部分实现 (…...
音视频 ColorSpace色彩空间详解
前言 基于前篇介绍YUV格式,本文继续介绍另一个重要概念颜色空间,又叫色彩空间;主要用于在音视频开发中的色彩空间转换。 色彩空间Color Space 色彩空间由色彩模型和色域共同定义。当色彩模型与特定的描述相关联以后,就称为色彩空间。 色彩模型Color Model 色彩模型Col…...
【字符设备驱动开发–IMX6ULL】(一)简介
【字符设备驱动开发–IMX6ULL】(一)简介 一、Linux驱动与裸机开发区别 1.裸机驱动开发回顾 1、底层,跟寄存器打交道,有些MCU提供了库。 spi.c:主机驱动(换成任何一个设备之后只需要调用此文件里面的…...
45 55跳跃游戏解题记录
先是55跳跃游戏,暴力解法会怎样?会超出时间限制,而且有很多细节要注意: func canJump(nums []int) bool {// 处理空数组情况,当nums只剩一个元素时,nums[i:]导致越界。if len(nums) 0 {return false}// 如…...
C++_STL之list篇
一、list的介绍 std::list是C标准模板库(STL)中的一个双向链表容器。与vector和deque不同,list不支持随机访问,但它在任何位置插入和删除元素都非常高效。 1.基本特性 (1)双向链表结构:每个元素都包含指向前驱和后继的指针 (2)非连续存储&…...
Go中的逃逸分析
什么是逃逸? 逃逸是指一个变量本来应该分配在栈(stack)上,但由于某些原因,最终被分配到了堆(heap)上。 类比: 栈就像一个临时的快餐盒,用来存放短期使用的数据。堆就像…...
Spring 声明式事务 万字详解(通俗易懂)
目录 Δ前言 一、声明式事务快速入门 1.为什么需要声明式事务? 2.定义: 3.应用实例: 二、声明式事务的传播机制 1.引出问题: 2.传播机制分类: 3.应用实例: 三、声明式事务的隔离机制 1.四种隔离级别&…...
MySQL 当中的锁
MySQL 当中的锁 文章目录 MySQL 当中的锁MySQL 中有哪些主要类型的锁?请简要说明MySQL 的全局锁有什么用?MySQL 的表级锁有哪些?作用是什么?元数据锁(MetaData Lock,MDL)意向锁(Inte…...
fyrox 2D和3D游戏的制作
目录 fyrox介绍 1. 核心特性 1.1 高性能渲染 1.2 跨平台支持 1.3 物理引擎集成 1.4 脚本系统 1.5 场景管理 2. 架构设计 2.1 渲染器 2.2 资源管理器 2.3 输入系统 2.4 音频引擎 2.5 网络模块 3. 使用场景 3.1 2D游戏 3.2 3D游戏 3.3 模拟与教育应用 4. 在游戏…...
[Linux]基础IO
基础IO C文件IO相关操作磁盘文件与内存文件inode(index node)硬链接与软连接硬链接软连接总结 动静态库静态库动态库总结 C文件IO相关操作 当前路径:进程运行的时候,所处的路径叫做当前路径 打开文件的时候,一定是进…...
力扣刷题-热题100题-第27题(c++、python)
21. 合并两个有序链表 - 力扣(LeetCode)https://leetcode.cn/problems/merge-two-sorted-lists/description/?envTypestudy-plan-v2&envIdtop-100-liked 常规法 创建一个新链表,遍历list1与list2,将新链表指向list1与list2…...
Vue3 其它API Teleport 传送门
Vue3 其它API Teleport 传送门 在定义一个模态框时,父组件的filter属性会影响子组件的position属性,导致模态框定位错误使用Teleport解决这个问题把模态框代码传送到body标签下...
