作者:尹正傑
版權宣告:原創作品,謝絕轉載!否則將追究法律責任。
目錄
- 一.原始碼編寫
- 二.編譯
- 三.測試
一.原始碼編寫
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