当前位置: 首页 > news >正文

一文理清GO语言日志库实现开发项目中的日志功能(rotatelogs/zap分析)

一文理清GO语言日志库实现开发项目中的日志功能(rotatelogs/zap分析)

rotatelogs

rotatelogs 是一个用于管理日志文件的 Go 语言库,它提供了自动轮换、压缩和删除旧日志文件的功能。这个库可以帮助你更好地管理和维护你的应用程序日志。要使用 rotatelogs,你需要先安装它:

go get -u github.com/lestrrat-go/file-rotatelogs

package mainimport ("github.com/lestrrat-go/file-rotatelogs""time"
)func main() {logFilePath := ""logFileName := ""// 创建一个日志文件轮换器r, err := rotatelogs.New(logFilePath+logFileName+"./mylog.%Y%m%d", // 日志文件名格式rotatelogs.WithLinkName("./mylog"),       // 软链接名rotatelogs.WithMaxAge(7*24*time.Hour),    // 最大保存时间rotatelogs.WithRotationTime(24*time.Hour), // 轮换间隔)if err != nil {panic(err)}// 使用 r 作为日志输出源logger := log.New(r, "", log.LstdFlags)logger.Println("Hello, rotatelogs!")
}

该示例代码会创建一个名为 mylog.YYYYMMDD 的日志文件,每天轮换一次,并保留最近 7 天的日志文件。你可以根据需要调整这些参数。

“go.uber.org/zap” 和 “go.uber.org/zap/zapcore” 是Go语言中的两个日志库。这两个库提供了高性能、可扩展的日志记录功能。

“go.uber.org/zap”

这个库提供了一个简单的API,用于记录日志。它包含了一些高级功能,如结构化日志记录、日志级别过滤、日志格式化等。要使用这个库,你需要先安装它:

go get -u go.uber.org/zap

然后在你的代码中导入并使用它:

package mainimport ("go.uber.org/zap"
)func main() {logger, err := zap.NewProduction()if err != nil {panic(err)}defer logger.Sync() // flushes buffer, if anylogger.Info("Hello, zap!")
}

下面是一些使用 “go.uber.org/zap” 进行高级日志记录的示例:

  1. 结构化日志记录:

    你可以使用结构体来记录日志,这样可以更方便地添加和删除字段。例如:

type MyLog struct {Time     time.Time `json:"time"`Level    string    `json:"level"`Message  string    `json:"message"`Username string    `json:"username,omitempty"`
}func main() {logger, err := zap.NewProduction()if err != nil {panic(err)}defer logger.Sync() // flushes buffer, if anylog := MyLog{Time:     time.Now(),Level:    "info",Message:  "Hello, zap!",Username: "Alice",}logger.Info("My log", zap.Object("log", log))
}
  1. 日志级别过滤:

    你可以设置不同的日志级别,以便在生产环境中只记录关键信息。例如:

func main() {logger, err := zap.NewDevelopment()if err != nil {panic(err)}defer logger.Sync() // flushes buffer, if anylogger.Debug("Debug message") // 不会输出,因为当前级别是 infologger.Info("Info message")   // 会输出logger.Warn("Warn message")   // 会输出logger.Error("Error message") // 会输出
}
  1. 日志格式化:

    你可以自定义日志的输出格式。例如,你可以使用 JSON 格式输出日志:

func main() {cfg := zap.NewProductionConfig()cfg.Encoding = "json"cfg.OutputPaths = []string{"stdout"}logger, err := cfg.Build()if err != nil {panic(err)}defer logger.Sync() // flushes buffer, if anylogger.Info("Hello, zap!", zap.String("foo", "bar"))
}

这些示例展示了如何使用 “go.uber.org/zap” 进行高级日志记录。你可以根据需要调整配置和使用这些功能。

“go.uber.org/zap/zapcore”

这个库提供了核心的日志记录功能,包括日志级别、日志格式、日志输出等。它是"go.uber.org/zap"库的基础。要使用这个库,你也需要先安装它:

go get -u go.uber.org/zap/zapcore

然后在你的代码中导入并使用它:

package mainimport ("go.uber.org/zap/zapcore"
)func main() {encoderConfig := zapcore.EncoderConfig{TimeKey:        "time",LevelKey:       "level",NameKey:        "logger",CallerKey:      "caller",MessageKey:     "msg",StacktraceKey:  "stacktrace",EncodeLevel:    zapcore.LowercaseLevelEncoder,EncodeTime:     zapcore.ISO8601TimeEncoder,EncodeDuration: zapcore.SecondsDurationEncoder,EncodeCaller:   zapcore.FullCallerEncoder,}
}

“go.uber.org/zap” 库提供了多种高级日志记录功能,以下是一些具体的例子和解释:

1. 结构化日志记录

Zap 支持使用结构体创建结构化的日志条目。例如:

import "go.uber.org/zap"type LogEntry struct {UserID   int       `json:"user_id"`Username string    `json:"username"`Email    string    `json:"email"`Message  string    `json:"message"`Timestamp time.Time `json:"timestamp"`
}func main() {logger, _ := zap.NewProduction()defer logger.Sync() // 确保所有日志都被 flushentry := LogEntry{UserID:   123,Username: "JohnDoe",Email:    "john@example.com",Message:  "User logged in",Timestamp: time.Now(),}logger.Info("User action", zap.Any("entry", entry))
}

在这个例子中,LogEntry 结构体被用来创建一个包含用户操作信息的日志条目。通过使用 zap.Any 将结构体作为任意类型的数据添加到日志中,这允许日志保留其结构格式。

2. 日志级别

Zap 提供不同的日志级别,用于控制日志的详细程度。例如:

import "go.uber.org/zap"func main() {logger, _ := zap.NewDevelopment()defer logger.Sync()logger.Debug("This is a debug message") // 仅在开发环境下可见logger.Info("This is an info message")  // 通常用于生产环境logger.Warn("This is a warning message") // 表示可能的问题logger.Error("This is an error message") // 表示错误logger.Panic("This is a panic message")  // 表示严重错误
}

通过设置不同的日志级别,你可以控制哪些消息应该被记录和注意,这对于不同环境(如开发、测试、生产)中的日志管理非常有用。

3. 日志格式化和输出

Zap 允许你自定义日志的格式化和输出方式。例如,可以将日志以 JSON 格式输出:

import ("go.uber.org/zap""go.uber.org/zap/zapcore"
)func main() {config := zap.NewProductionConfig()config.Encoding = "json"logger, _ := config.Build()defer logger.Sync()logger.Info("Hello, Zap!", zap.String("key", "value"))
}

在这个例子中,日志条目将以 JSON 格式输出,这是通过设置 config.Encoding"json" 实现的。这使得日志具有更好的结构化和可读性,便于日志解析和分析工具处理。

通过这些高级功能,go.uber.org/zap 提供了强大而灵活的日志记录解决方案,适用于各种规模和复杂度的 Go 语言项目。

总之,“go.uber.org/zap” 是一个更高级的日志库,它基于 “go.uber.org/zap/zapcore” 提供了更多的功能。

相关文章:

一文理清GO语言日志库实现开发项目中的日志功能(rotatelogs/zap分析)

一文理清GO语言日志库实现开发项目中的日志功能(rotatelogs/zap分析) rotatelogs rotatelogs 是一个用于管理日志文件的 Go 语言库,它提供了自动轮换、压缩和删除旧日志文件的功能。这个库可以帮助你更好地管理和维护你的应用程序日志。要使…...

【Go语言精进之路】构建高效Go程序:了解string实现原理并高效使用

🔥 个人主页:空白诗 🔥 热门专栏:【Go语言精进之路】 文章目录 引言一、Go语言的字符串类型1.1 字符串的定义1.2 字符串的零值可用1.3 字符串的不可变性1.4 字符串的拼接1.5 字符串的常用方法1.6 实际使用示例 二、字符串的内部表…...

HDFS 常见命令

在HDFS创建文件夹:hdfs dfs -mkdir /test 复制本地文件到HDFS中某个目录下:hdfs dfs -put /本地路径 /hdfs 路径 查看文件内容:hdfs dfs -cat /test.txt 查看当前文件夹目录:hdfs dfs -ls / 查看文件夹中的文件数:…...

示例:WPF中应用Grid的SharedSizeGroup设置整齐的布局

一、目的&#xff1a;应用Grid的SharedSizeGroup设置整齐的布局 二、实现 <ItemsControl ItemsSource"{local:GetStudents Count5}"><ItemsControl.ItemTemplate><DataTemplate><Grid ShowGridLines"True"><Grid.ColumnDefinit…...

React的form表单自定义校验规则

使用antd开发的过程中&#xff0c;必定会遇到需要对form表单进行必填校验的处理&#xff0c;正常情况下&#xff0c;我们都会一个空的必填校验&#xff0c;如下&#xff1a;一般我们只需要简单配置rules即可 <FormItem label"管理员姓名" {...itemLayout.wholeLi…...

一种新的一维时间序列信号盲解卷积算法(以旋转机械故障诊断为例,MATLAB环境)

一种新的一维时间序列信号盲解卷积算法&#xff08;以旋转机械故障诊断为例&#xff0c;MATLAB环境&#xff09;&#xff0c;可作为深度学习信号前处理过程&#xff0c;水个SCI不是问题。 机械设备的状态信号中往往蕴含着大量的设备异常信息。如何从繁多的机械状态信号中提取足…...

618电商是社区网站入局的好时机吗?

近日&#xff0c;随着618大促的临近&#xff0c;许多内容平台像B站、小红书等纷纷被电商活动所充斥&#xff0c;让用户感觉仿佛被电商绑架一般。这种用户体验的极度不佳让人开始思考&#xff0c;难道这就是互联网社区的未来发展方向吗&#xff1f; 在所有平台性质的社区中&…...

不知道密码,一样能卸载瑞星esm防病毒终端安全防护系统

离开单位后试图卸载瑞星的时候却发现还需要密码&#xff0c;真是烦死了。研究了几分钟后找到了完美卸载方法。 首先&#xff0c;让我们请出老流氓360安全卫士&#xff0c;下载好它&#xff0c;让右键菜单出现使用 360强力删除这一选项。 之后&#xff0c;进入安全模式&#x…...

Chromium 开发指南2024 Mac篇-安装和配置depot_tools工具(三)

1.引言 在前两篇指南中&#xff0c;我们详细介绍了在 macOS 环境下编译 Chromium 所需的硬件要求和系统依赖&#xff0c;并具体讲解了如何正确安装和配置 Xcode。通过这些步骤&#xff0c;您已经为编译 Chromium 打下了坚实的基础。然而&#xff0c;编译 Chromium 还需要配置一…...

微信小程序-路由和页面跳转API

一.wx.navigateTo wx.navigateTo是通过编程实现页面跳转&#xff0c;和navigator组件组件中&#xff0c;open-type"navigate"属性类似&#xff0c;是保留当前页面跳转新的页面&#xff0c;不适用tabbar页面。 //保留当前页面&#xff0c;跳转到非tabbar页面wx.navig…...

PWR电源控制

一、PWR简介 1、PWR&#xff08;Power Control&#xff09;电源控制 &#xff08;1&#xff09;PWR负责管理STM32内部的电源供电部分&#xff0c;可以实现可编程电压监测器和低功耗模式的功能 &#xff08;2&#xff09;可编程电压监测器&#xff08;PVD&#xff09;可以监控…...

【记录46】【案例】echarts 柱状图

echarts环境4.1.0 <template><div id"threefour"></div> </template> <script> import * as echarts from "echarts" export default {name:"",components:{},data(){return {}},methods:{getdata(){var myChart…...

Github2024-06-12 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-06-12统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目4JavaScript项目2Lua项目1PHP项目1Blade项目1非开发语言项目1TypeScript项目1Shell项目1从零开始构建你喜爱的技术 创建周期:2156 天…...

茶艺师服务师傅小程序APP源码(APP+小程序+公众号+H5)

&#x1f375;茶艺师服务小程序&#xff1a;品味生活的茶艺新体验&#x1f331; &#x1f33f;一、引言&#xff1a;茶艺师服务小程序&#xff0c;让生活更有味 在繁忙的生活中&#xff0c;品一杯香茗&#xff0c;感受茶文化的韵味&#xff0c;是许多人向往的休闲方式。然而&…...

【正则表达式】入门

参考视频&#xff1a;10分钟快速掌握正则表达式_哔哩哔哩_bilibili 这个网站用来测试写的正则表达式效果&#xff1a;regex101: build, test, and debug regex 示例&#xff1a; 限定符 ? 表示前一个字符可有可无 比如这里输入&#xff1a;de? 匹配结果可以得到d和de * 前…...

制造业为什么需要ERP企业管理软件?

如今&#xff0c;传统的制造业管理方式逐渐变得力不从心~库存积压、生产效率低下、供应链混乱…想象一下&#xff0c;如果你的企业仍然依赖于手工记录订单、库存和财务数据&#xff0c;那么每当市场发生变动时&#xff0c;你就需要花费大量的时间和精力去重新调整生产计划、更新…...

JavaScript Prototype

JavaScript Prototype JavaScript 是一种高级的、解释执行的编程语言&#xff0c;广泛应用于网页和服务器端开发。JavaScript 的核心特性之一是其原型继承机制&#xff0c;这是理解 JavaScript 对象模型的关键。 什么是 Prototype&#xff1f; 在 JavaScript 中&#xff0c;…...

Web Works API 和 Promise 的对比和区别

Web Workers 和 Promise 都是强大的工具&#xff0c;用于不同的异步处理场景。Web Workers 适用于需要并行处理的复杂任务&#xff0c;通过后台线程避免阻塞主线程。而 Promise 则简化了单线程中的异步操作管理&#xff0c;使代码更加清晰和结构化。根据具体需求选择合适的技术…...

jeecg快速启动(附带本地运行可用版本下载)

版本整理&#xff08;windows x64位&#xff09;&#xff1a; redis&#xff1a;3.0.504 MYSQL&#xff1a;5.7 Maven&#xff1a;3.9.4(setting文件可下载) Nodejs&#xff1a;v16.20.2&#xff08;建议不要安装默认路径下&#xff0c;如已安装在c盘&#xff0c;运行yarn报…...

【PPT教程】一键重置幻灯片背景的方法,新建幻灯片带默认背景

目的是替换18届的研电赛ppt背景为19届 这里写目录标题 1.设计->设置背景格式2.图片或纹理填充->插入3.选择需要替换为背景的照片4.点击下方的应用到全部 1.设计->设置背景格式 2.图片或纹理填充->插入 3.选择需要替换为背景的照片 4.点击下方的应用到全部 此时全部…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...