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

本文涉及的产品
EMR Serverless StarRocks,5000CU*H 48000GB*H
可观测监控 Prometheus 版,每月50GB免费额度
日志服务 SLS,月写入数据量 50GB 1个月
简介: 这篇文章是关于如何在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 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
目录
相关文章
|
14天前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
47 4
Golang语言之管道channel快速入门篇
|
14天前
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
37 4
Golang语言文件操作快速入门篇
|
14天前
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
42 3
Golang语言之gRPC程序设计示例
|
14天前
|
安全 Go
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
37 4
|
14天前
|
Go 调度
Golang语言goroutine协程篇
这篇文章是关于Go语言goroutine协程的详细教程,涵盖了并发编程的常见术语、goroutine的创建和调度、使用sync.WaitGroup控制协程退出以及如何通过GOMAXPROCS设置程序并发时占用的CPU逻辑核心数。
23 4
Golang语言goroutine协程篇
|
24天前
|
Kubernetes Ubuntu Windows
【Azure K8S | AKS】分享从AKS集群的Node中查看日志的方法(/var/log)
【Azure K8S | AKS】分享从AKS集群的Node中查看日志的方法(/var/log)
|
6天前
|
Java
日志框架log4j打印异常堆栈信息携带traceId,方便接口异常排查
日常项目运行日志,异常栈打印是不带traceId,导致排查问题查找异常栈很麻烦。
|
16天前
|
存储 监控 数据可视化
SLS 虽然不是直接使用 OSS 作为底层存储,但它凭借自身独特的存储架构和功能,为用户提供了一种专业、高效的日志服务解决方案。
【9月更文挑战第2天】SLS 虽然不是直接使用 OSS 作为底层存储,但它凭借自身独特的存储架构和功能,为用户提供了一种专业、高效的日志服务解决方案。
49 9
|
25天前
|
开发框架 .NET Docker
【Azure 应用服务】App Service .NET Core项目在Program.cs中自定义添加的logger.LogInformation,部署到App Service上后日志不显示Log Stream中的问题
【Azure 应用服务】App Service .NET Core项目在Program.cs中自定义添加的logger.LogInformation,部署到App Service上后日志不显示Log Stream中的问题
|
29天前
|
存储 监控 安全