Go Engineering - Foundation - CLI
CLI Cobra 很好地集成了 Pflag 和 Viper 工具包 用途 Pflag 命令行参数解析 Viper 配置文件解析 Cobra 命令行框架 Pflag Pflag 通过创建 Flag 和 FlagSet 来使用,使用 Pflag 的开源项目:Kubernetes、Istio、Helm、Docker、Etcd Flag 一个命令行参数会被解析成一个 Flag 类型的变量 1234567891011121314// A Flag represents the state of a flag.type Flag struct { Name string // name as it appears on command line Shorthand string // one-letter abbreviated flag Usage string // help message ...
Go Engineering - Foundation - Log - Package
开源日志包标准库 log 包 标准库自带,无需安装 只提供 Print、Panic、Fatal 函数用于日志输出 Go 标准库大量使用了该 log 包 glog Kubernetes 使用的 klog 是基于 glog 进行封装 Google 推出的轻量级日志包 特性 支持 4 种日志级别: Info、Warning、Error、Fatal 支持命令行选项 支持根据文件大小切割日志文件 支持日志按级别分类输出 支持 V level – 开发者自定义日志级别 支持 vmodule – 开发者对不同的文件使用不同的日志级别 支持 traceLocation – 打印指定位置的栈信息 logrus Github star 数量最多的日志包,Docker 和 Prometheus 也在使用 logrus 支持常用的日志级别 可扩展:允许使用者通过 Hook 的方式,将日志分发到任意地方 支持自定义的日志格式:内置支持 JSON 和 TEXT 结构化日志记录:Field 机制允许使用者自定义字段 预设日志字段:Default Field 机制,可以给一部分或者全部日志统一添加共同的日志字段...
Go Engineering - Foundation - Log - Design
功能需求基础功能 支持基本的日志信息:时间戳、文件名、行号、日志级别、日志内容 支持不同的日志级别:Trace(可选)、Debug、Info、Warn、Error、Panic(可选)、Fatal 期望级别:glog.Info("This is info message") 开关级别:glog -v=4,只有日志级别高于等于 4 的日志才会被打印 支持自定义配置:不同的运行环境,需要不同的日志输出配置,在不重新编译代码的情况下,改变记录日志的行为 支持输出到标准输出(实时读取)和本地文件(采集索引) 高级功能 支持多种日志格式:TEXT、JSON 按日志级别分类输出:至少 Error 级别的日志输出到独立的文件中 支持结构化日志:使用 JSON 或者其它编码方式使日志结构化 支持日志轮转:借助 Linux Logrotate 来完成,不在日志包中实现 具备 Hook 能力 例如:当 Error 级别的日志产生时,发送邮件或者调用告警接口进行告警 日志告警的最佳方案:通过旁路功能,将日志采集到第三方组件(如 ES),日志包功能应尽量内聚 1234567891011121...
Go Engineering - Foundation - Error - Package
功能需求 支持错误堆栈 支持不同的打印格式,例如 %+v、%v、%s 等 支持 Wrap/Unwrap 功能:在已有 error 的基础上,追加一些新的信息 errors.Wrap(err, "open file failed") 调用 Wrap 时,会生成一个错误堆栈节点 支持 Is 方法:判断某个 error 是否为指定的 error Go 1.13 之前,并没有 wrapping error if err == os.ErrNotExist {} 有 wrapping error 后,直接用 == 判断会有问题,因为可能是 wrapping error func Is(err, target error) bool err 和 target 是同一个 当 err 是 wrapping error 时,target 包含在这个嵌套 error 链中 支持 As 函数 Go 1.13 之前,并没有 wrapping error,可以使用 type assertion 或者 type switch if perr, ok := err...
Go Engineering - Foundation - Error - Code
设计方式 场景:用户账号没有找到 200 HTTP Code 通常代表的是 HTTP Transport 层的状态信息;但对性能有一定的影响,因为需要解析 HTTP Body 12345678{ "error": { "message": "Syntax error \"Field picture specified more than once. This is only possible before version 2.1\" at character 23: id,name,picture,picture", "type": "OAuthException", "code": 2500, "fbtrace_id": "xxxxxxxxxxx" }} 4xx + 简单信息 可以让客户端快速感知请求失败,但提供的信息过于简单,不能准确地定位问题 ...















