Golang语言之Prometheus的日志模块使用案例

本文涉及的产品
可观测监控 Prometheus 版,每月50GB免费额度
日志服务 SLS,月写入数据量 50GB 1个月
EMR Serverless StarRocks,5000CU*H 48000GB*H
简介: 这篇文章是关于如何在Golang语言项目中使用Prometheus的日志模块的案例,包括源代码编写、编译和测试步骤。

                                              作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.源代码编写

package main

import (
    "fmt"
    "os"
    "path/filepath"
    "time"

    "github.com/alecthomas/kingpin/v2"
    "github.com/go-kit/log"
    "github.com/go-kit/log/level"

    "github.com/prometheus/common/promlog"
    promlogflag "github.com/prometheus/common/promlog/flag"
    "github.com/prometheus/common/version"
)

var (
    videos = "https://space.bilibili.com/600805398/channel/series"
    docs   = "https://www.cnblogs.com/yinzhengjie"
    // 命令行解析
    app = kingpin.New(filepath.Base(os.Args[0]), fmt.Sprintf("yinzhengjie-devops'server Program, docs: %s, videos: %s", docs, videos))
    // 指定配置文件
    configFile = app.Flag("config.file", "configuration file path").Short('c').Default("yinzhengjie-devops-server.yaml").String()
)

// Logger用于设置prometheus的Logger,
func Logger(config *promlog.Config) log.Logger {
    var (
        l  log.Logger
        le level.Option
    )

    // 设置日志的输出格式
    if config.Format.String() == "logfmt" {
        l = log.NewLogfmtLogger(log.NewSyncWriter(os.Stderr))
    } else {
        l = log.NewJSONLogger(log.NewSyncWriter(os.Stderr))
    }

    // 设置日志级别
    switch config.Level.String() {
    case "debug":
        le = level.AllowDebug()
    case "info":
        le = level.AllowInfo()
    case "warn":
        le = level.AllowWarn()
    case "error":
        le = level.AllowError()
    }

    l = level.NewFilter(l, le)

    // CST可视为美国、澳大利亚、古巴或中国的标准时间,CST可以为如下4个不同的时区的缩写:
    //         美国中部时间:Central Standard Time (USA) UT-6:00
    //         澳大利亚中部时间:Central Standard Time (Australia) UT+9:30
    //         中国标准时间:China Standard Time UT+8:00
    //         古巴标准时间:Cuba Standard Time UT-4:00
    //
    // 重新设置一下时区,否则是UTC时间,建议设置CST时区,我们以北京的东八区时间为准。
    l = log.With(l, "cst", log.TimestampFormat(
        func() time.Time { return time.Now().Local() },
        "2006-01-02T15:04:05.000Z08:00",
    ), "caller", log.DefaultCaller)
    return l
}

func main() {
    // 版本信息
    // app.Version("v1.0")
    app.Version(version.Print("yinzhengjie-devops-server"))

    // 帮助信息
    app.HelpFlag.Short('h')
    promlogConfig := promlog.Config{}

    promlogflag.AddFlags(app, &promlogConfig)

    // 强制解析
    kingpin.MustParse(app.Parse(os.Args[1:]))

    fmt.Printf("configFile: %s\n", *configFile)

    // 设置prometheus的logger
    var logger log.Logger = Logger(&promlogConfig)

    // 输出日志事件时需要指定日志级别,此处我指定的日志级别为"info"
    level.Info(logger).Log(
        // 注意,写入的数据成对出现,比如下面的案例我就写了5对测试数据。
        "Name", "尹正杰",
        "Hobby", "Golang K8S Docker",
        "blog", "https://www.cnblogs.com/yinzhengjie",
        "cfg", *configFile,
        "age", 18,
    )
}

二.编译

go build -o server -ldflags "-X 'github.com/prometheus/common/version.BuildUser=y1053419035@qq.com' -X 'github.com/prometheus/common/version.BuildDate=`date`' -X 'github.com/prometheus/common/version.Version=v0.2'" src/models/server/server.go

三.测试

    1.查看服务的版本信息
./server --version

    2.指定程序的配置文件
./server -c /etc/nginx/conf.d/games.conf

    3.查看程序的帮助信息
./server -h

    4.不指定任何参数
./server

    5.指定日志输出格式
./server --log.format=json

    6.同时指定多个参数
./server --log.format=json -c /etc/nginx/nginx.conf
相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
目录
相关文章
|
12天前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
43 4
Golang语言之管道channel快速入门篇
|
12天前
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
36 4
Golang语言文件操作快速入门篇
|
12天前
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
40 3
Golang语言之gRPC程序设计示例
|
12天前
|
安全 Go
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
36 4
|
12天前
|
Go 调度
Golang语言goroutine协程篇
这篇文章是关于Go语言goroutine协程的详细教程,涵盖了并发编程的常见术语、goroutine的创建和调度、使用sync.WaitGroup控制协程退出以及如何通过GOMAXPROCS设置程序并发时占用的CPU逻辑核心数。
23 4
Golang语言goroutine协程篇
|
12天前
|
Go
Golang语言错误处理机制
这篇文章是关于Golang语言错误处理机制的教程,介绍了使用defer结合recover捕获错误、基于errors.New自定义错误以及使用panic抛出自定义错误的方法。
35 3
|
12天前
|
Go
Golang语言之函数(func)进阶篇
这篇文章是关于Golang语言中函数高级用法的教程,涵盖了初始化函数、匿名函数、闭包函数、高阶函数、defer关键字以及系统函数的使用和案例。
16 3
Golang语言之函数(func)进阶篇
|
12天前
|
Go
Golang语言之函数(func)基础篇
这篇文章深入讲解了Golang语言中函数的定义和使用,包括函数的引入原因、使用细节、定义语法,并通过多个案例展示了如何定义不返回任何参数、返回一个或多个参数、返回值命名、可变参数的函数,同时探讨了函数默认值传递、指针传递、函数作为变量和参数、自定义数据类型以及返回值为切片类型的函数。
17 2
Golang语言之函数(func)基础篇
|
12天前
|
Go
Golang语言之映射(map)快速入门篇
这篇文章是关于Go语言中映射(map)的快速入门教程,涵盖了map的定义、创建方式、基本操作如增删改查、遍历、嵌套map的使用以及相关练习题。
21 5
|
12天前
|
Go
Golang语言之切片(slice)快速入门篇
这篇文章是关于Go语言中切片(slice)的快速入门教程,详细介绍了切片的概念、定义方式、遍历、扩容机制、使用注意事项以及相关练习题。
21 5