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

简介: 这篇文章是关于如何在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/[email protected]' -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
目录
相关文章
|
2月前
|
监控 安全 程序员
Python日志模块配置:从print到logging的优雅升级指南
从 `print` 到 `logging` 是 Python 开发的必经之路。`print` 调试简单却难维护,日志混乱、无法分级、缺乏上下文;而 `logging` 支持级别控制、多输出、结构化记录,助力项目可维护性升级。本文详解痛点、优势、迁移方案与最佳实践,助你构建专业日志系统,让程序“有记忆”。
290 0
|
2月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
228 1
|
运维 监控 Cloud Native
一行代码都不改,Golang 应用链路指标日志全知道
本文将通过阿里云开源的 Golang Agent,帮助用户实现“一行代码都不改”就能获取到应用产生的各种观测数据,同时提升运维团队和研发团队的幸福感。
667 130
|
前端开发 中间件 Go
实践Golang语言N层应用架构
【10月更文挑战第2天】本文介绍了如何在Go语言中使用Gin框架实现N层体系结构,借鉴了J2EE平台的多层分布式应用程序模型。文章首先概述了N层体系结构的基本概念,接着详细列出了Go语言中对应的构件名称,包括前端框架(如Vue.js、React)、Gin的处理函数和中间件、依赖注入和配置管理、会话管理和ORM库(如gorm或ent)。最后,提供了具体的代码示例,展示了如何实现HTTP请求处理、会话管理和数据库操作。
255 1
|
存储 数据可视化 安全
一个简单案例,带你看懂GC日志!
一个简单案例,带你看懂GC日志!
117 0
一个简单案例,带你看懂GC日志!
|
Shell Python
salt自定义模块内使用日志例子
salt自定义模块内使用日志例子
|
7月前
|
监控 容灾 算法
阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化
本文探讨了如何高效、经济且可靠地将海外应用与基础设施日志统一采集至阿里云日志服务(SLS),解决全球化业务扩展中的关键挑战。重点介绍了高性能日志采集Agent(iLogtail/LoongCollector)在海外场景的应用,推荐使用LoongCollector以获得更优的稳定性和网络容错能力。同时分析了多种网络接入方案,包括公网直连、全球加速优化、阿里云内网及专线/CEN/VPN接入等,并提供了成本优化策略和多目标发送配置指导,帮助企业构建稳定、低成本、高可用的全球日志系统。
843 54
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
381 9

推荐镜像

更多