golang 应用日志实践

这里可以分为命令行应用和服务端应用两类情况

命令行客户端应用

典型就是 kubectl 这种客户端应用,下面是一个使用 op/go-logging 库配置多端输出的例子,应用将会同时输出到标准输出和写入日志文件

var formatStdout = logging.MustStringFormatter(
	`%{color}%{time:2006-01-02 15:04:05.000} [%{level:.8s}] %{message}%{color:reset}`,
)

var formatLogfile = logging.MustStringFormatter(
	`%{time:2006-01-02 15:04:05.000} [%{level:.8s}] %{message}`,
)

func initLog() {
	logFile, err := os.OpenFile(viper.GetString("log.file"), os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0640)
	if err != nil {
		fmt.Println(err)
		panic(err)
	}
	backendLogFile := logging.NewLogBackend(logFile, "", 0)
	backendStdout := logging.NewLogBackend(os.Stdout, "", 0)

	backendLogFileFormatter := logging.NewBackendFormatter(backendLogFile, formatLogfile)
	backendStdoutFormatter := logging.NewBackendFormatter(backendStdout, formatStdout)

	logging.SetBackend(backendLogFileFormatter, backendStdoutFormatter)
}

持续服务类型应用

典型就是 web 应用,通常我们通过 supervisord 部署,所以我们可以选择在应用中直接输出到 stderr 或者 stdout,通过 supervisord 配置日志文件