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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
可观测监控 Prometheus 版,每月50GB免费额度
简介: 这篇文章是关于如何在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 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
目录
相关文章
|
1月前
|
安全 Go
用 Zap 轻松搞定 Go 语言中的结构化日志
在现代应用程序开发中,日志记录至关重要。Go 语言中有许多日志库,而 Zap 因其高性能和灵活性脱颖而出。本文详细介绍如何在 Go 项目中使用 Zap 进行结构化日志记录,并展示如何定制日志输出,满足生产环境需求。通过基础示例、SugaredLogger 的便捷使用以及自定义日志配置,帮助你在实际开发中高效管理日志。
51 1
|
3月前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
129 4
Golang语言之管道channel快速入门篇
|
3月前
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
110 3
Golang语言之gRPC程序设计示例
|
15天前
|
运维 监控 Cloud Native
一行代码都不改,Golang 应用链路指标日志全知道
本文将通过阿里云开源的 Golang Agent,帮助用户实现“一行代码都不改”就能获取到应用产生的各种观测数据,同时提升运维团队和研发团队的幸福感。
|
2月前
|
存储 数据可视化 安全
一个简单案例,带你看懂GC日志!
一个简单案例,带你看懂GC日志!
一个简单案例,带你看懂GC日志!
|
2月前
|
前端开发 中间件 Go
实践Golang语言N层应用架构
【10月更文挑战第2天】本文介绍了如何在Go语言中使用Gin框架实现N层体系结构,借鉴了J2EE平台的多层分布式应用程序模型。文章首先概述了N层体系结构的基本概念,接着详细列出了Go语言中对应的构件名称,包括前端框架(如Vue.js、React)、Gin的处理函数和中间件、依赖注入和配置管理、会话管理和ORM库(如gorm或ent)。最后,提供了具体的代码示例,展示了如何实现HTTP请求处理、会话管理和数据库操作。
34 0
|
3月前
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
71 4
Golang语言文件操作快速入门篇
|
3月前
|
安全 Go
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
100 4
|
3月前
|
Go
Golang语言错误处理机制
这篇文章是关于Golang语言错误处理机制的教程,介绍了使用defer结合recover捕获错误、基于errors.New自定义错误以及使用panic抛出自定义错误的方法。
52 3
|
3月前
|
Go 调度
Golang语言goroutine协程篇
这篇文章是关于Go语言goroutine协程的详细教程,涵盖了并发编程的常见术语、goroutine的创建和调度、使用sync.WaitGroup控制协程退出以及如何通过GOMAXPROCS设置程序并发时占用的CPU逻辑核心数。
69 4
Golang语言goroutine协程篇