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

【go从零单排】Logging

挪威特罗姆瑟夜景

🌈Don’t worry , just coding!
内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。

📗概念

在 Go 语言中,log 包提供了一种简单的方式来记录日志。它支持多种日志级别和格式,可以将日志输出到不同的目标(如标准输出、文件等)。

设置日志前缀和标志

你可以使用 log.SetPrefix() 和 log.SetFlags() 来设置日志的前缀和格式标志。

  • 前缀:在每条日志信息前添加特定的字符串。
  • 标志:控制日志输出的内容,例如时间戳、文件名和行号等。

💻代码

基本用法

package main

import (
	//bytes: 提供了操作字节切片的功能。
	//fmt: 提供格式化输入和输出的功能。
	//log: 提供基本的日志记录功能。
	//os: 提供与操作系统交互的功能,例如文件操作。
	//log/slog: 提供结构化日志记录功能(在 Go 1.21 中引入)。
	"bytes"
	"fmt"
	"log"
	"log/slog"
	"os"
)

func main() {
	//使用标准日志记录器打印一条消息:“standard logger”。
	log.Println("standard logger")
	//设置日志记录器的标志,包含标准时间格式和微秒,并打印一条消息:“with micro”。
	log.SetFlags(log.LstdFlags | log.Lmicroseconds)
	log.Println("with micro")
	//设置日志记录器的标志,包含标准时间格式和短文件名(文件名和行号),并打印一条消息:“with file/line”。
	log.SetFlags(log.LstdFlags | log.Lshortfile)
	log.Println("with file/line")
	//设置日志记录器的标志,包含标准时间格式和短文件名(文件名和行号),并打印一条消息:“with file/line”。
	mylog := log.New(os.Stdout, "my:", log.LstdFlags)
	mylog.Println("from mylog")
	//更改 mylog 的前缀为 "ohmy:",并打印一条消息:“from mylog”。
	mylog.SetPrefix("ohmy:")
	mylog.Println("from mylog")
	//创建一个 bytes.Buffer 类型的变量 buf,并创建一个新的日志记录器 buflog,将输出写入 buf,带有前缀 "buf:"。
	var buf bytes.Buffer
	buflog := log.New(&buf, "buf:", log.LstdFlags)

	buflog.Println("hello")
	//打印 buf 中的内容,输出为:“from buflog:hello”。
	fmt.Print("from buflog:", buf.String())
	//创建一个 JSON 日志处理器 jsonHandler,将输出写入标准错误(os.Stderr)
	jsonHandler := slog.NewJSONHandler(os.Stderr, nil)
	//使用该处理器创建一个新的结构化日志记录器 myslog。
	myslog := slog.New(jsonHandler)
	myslog.Info("hi there")
	//使用 myslog 打印一条信息日志:“hello again”,附带一些键值对数据(key: val 和 age: 25)。
	myslog.Info("hello again", "key", "val", "age", 25)
}
//输出
//2024/11/13 16:54:04 standard logger
//2024/11/13 16:54:04.976166 with micro
//2024/11/13 16:54:04 post.go:24: with file/line
//my:2024/11/13 16:54:04 from mylog
//ohmy:2024/11/13 16:54:04 from mylog
//from buflog:buf:2024/11/13 16:54:04 hello
//{"time":"2024-11-13T16:54:04.976206+08:00","level":"INFO","msg":"hi there"}
//{"time":"2024-11-13T16:54:04.976227+08:00","level":"INFO","msg":"hello again","key":"val","age":25}

输出到文件

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.Fatal(err)
    }
    defer file.Close()

    log.SetOutput(file)
    log.Println("This message will be logged to a file.")
}

使用结构化日志

package main

import (
    "log/slog"
    "os"
)

func main() {
    handler := slog.NewJSONHandler(os.Stderr, nil)
    logger := slog.New(handler)

    logger.Info("This is a structured log message", "key", "value", "age", 30)
}

💪无人扶我青云志,我自踏雪至山巅。
在这里插入图片描述


http://www.kler.cn/a/392847.html

相关文章:

  • 新版 idea 编写 idea 插件时,启动出现 ClassNotFound
  • 【OH】openHarmony开发环境搭建(基于windows子系统WSL)
  • 数据库SQL——连接表达式(JOIN)图解
  • 虚拟机安装Ubuntu 24.04服务器版(命令行版)
  • 《MYSQL45讲》kill不掉的线程
  • L10.【LeetCode笔记】回文链表
  • uniapp中多角色导致tabbar过多的解决方式
  • 基于Python的自然语言处理系列(59):MultiRetrievalQAChain 实现
  • 基于SSM的“汽车销售分析与管理系统”的设计与实现(源码+数据库+文档+PPT)
  • 笔记本电脑定期保养
  • SwiftUI开发教程系列 - 第十二章:本地化与多语言支持
  • 贪心算法入门(二)
  • 【ROS的Navigation导航系统】
  • (附项目源码)Java开发语言,监督管家APP的设计与实现 58,计算机毕设程序开发+文案(LW+PPT)
  • 传奇996_19——常用函数
  • redis 原理篇 30 redis内存回收 过期key处理
  • 前端框架大比拼:React.js, Vue.js 及 Angular 的优势与适用场景探讨
  • linux,源码编译安装、rsync本地同步、rsync远程同步、inotifywaite实时同步、数据库服务基础、邮件的收发
  • LuaRocks如何安装数据库驱动?
  • Dubbo 3.x源码(24)—Dubbo服务引用源码(7)接口级服务发现订阅refreshInterfaceInvoker
  • Database Advantages (数据库系统的优点)
  • HTML文本标签学习记录
  • 乐理的学习(助音延伸,力度,速度,省略记号)
  • Rust,删除cargo安装的可执行文件
  • 计算机毕业设计Python+大模型农产品价格预测 ARIMA自回归模型 农产品可视化 农产品爬虫 机器学习 深度学习 大数据毕业设计 Django Flask
  • JVM详解:JVM的系统架构