我们可以将所有控制台日志定向到文件吗?

使用命令在本地运行 Web 应用程序时


go run MainPackageFile.go

我们可以映射记录器,例如用马提尼


m := martini.Classic()

m.Get("/m", func() string {

  return "Hello world!"

})

m.Map(log.New(f, "[martini]", log.LstdFlags))

但是,如果代码之外有什么问题怎么办,例如 Go 无法下载包等……有没有办法获取这些 Go 运行时日志?在本地运行时,错误将打印到控制台上。有没有办法在服务器中运行时,我们可以将所有这些日志写入文本文件?


函数式编程
浏览 185回答 2
2回答

杨魅力

假设您的代码使用日志库在任何地方报告错误,您可以更改默认记录器写入的文件,而不是定义您自己的日志对象并将其传递。这是通过日志库的SetOutput()函数完成的。这样,以下代码只会写入您的日志文件而不是标准错误:// Call this when your program starts and pass it the file handle for your// log file.func SetupErrorLog(logFile io.Writer) {    log.SetOutput(logFile)}...func DoSomething() {    ...    if err != nil {       // prints to your log file and exits       log.Fatalln("A fatal error has occurred:", err)   }}如果您没有统一使用日志库并且想要捕获所有输出(如恐慌),则接受的答案有效。但是,我更喜欢一种更简单的方法,而不会通过在调用程序时使用记录器之类的工具来使代码复杂化:go run MainPackageFile.go 2>&1 | logger这会将您程序的所有输出发送到 syslog,而不必弄乱您的代码。logger 命令有许多选项来自定义日志记录行为,包括选择您自己的日志文件的能力。阅读记录器手册页以获取更多信息。记录器命令在 Unix 系统(包括 Mac)上可用。Windows 解决方案可能略有不同。

ibeautiful

假设您的代码使用日志库在任何地方报告错误,您可以更改默认记录器写入的文件,而不是定义您自己的日志对象并将其传递。这是通过日志库的SetOutput()函数完成的。这样,以下代码只会写入您的日志文件而不是标准错误:// Call this when your program starts and pass it the file handle for your// log file.func SetupErrorLog(logFile io.Writer) {    log.SetOutput(logFile)}...func DoSomething() {    ...    if err != nil {       // prints to your log file and exits       log.Fatalln("A fatal error has occurred:", err)   }}如果您没有统一使用日志库并且想要捕获所有输出(如恐慌),则接受的答案有效。但是,我更喜欢一种更简单的方法,而不会通过在调用程序时使用记录器之类的工具来使代码复杂化:go run MainPackageFile.go 2>&1 | logger这会将您程序的所有输出发送到 syslog,而不必弄乱您的代码。logger 命令有许多选项来自定义日志记录行为,包括选择您自己的日志文件的能力。阅读记录器手册页以获取更多信息。记录器命令在 Unix 系统(包括 Mac)上可用。Windows 解决方案可能略有不同。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go