Golang語言之Prometheus的日誌模組使用案例

尹正杰發表於2024-08-10

                                              作者:尹正傑

版權宣告:原創作品,謝絕轉載!否則將追究法律責任。

目錄
  • 一.原始碼編寫
  • 二.編譯
  • 三.測試

一.原始碼編寫

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, "cts", 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

相關文章