作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.源代码编写
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