我从golang开始,随着我开始建立自己的应用程序,我想从一开始就添加日志记录,这就是我遇到问题的地方。
如果我打开文件并使用标准日志记录库,则可以写入文件。像这样
package main import ( "os" "fmt" "log" ) func main() { // open a file f, err := os.OpenFile("test.log", os.O_APPEND | os.O_CREATE | os.O_RDWR, 0666) if err != nil { fmt.Printf("error opening file: %v", err) } // don't forget to close it defer f.Close() // assign it to the standard logger log.SetOutput(f) log.Output(1, "this is an event") }
我将获得带有日志行的test.log。但是,如果我尝试调整它以支持logrus https://github.com/Sirupsen/logrus这样
package main import ( "os" "fmt" log "github.com/Sirupsen/logrus" ) func init() { // open a file f, err := os.OpenFile("testlogrus.log", os.O_APPEND | os.O_CREATE | os.O_RDWR, 0666) if err != nil { fmt.Printf("error opening file: %v", err) } // don't forget to close it defer f.Close() // Log as JSON instead of the default ASCII formatter. log.SetFormatter(&log.JSONFormatter{}) // Output to stderr instead of stdout, could also be a file. log.SetOutput(f) // Only log the warning severity or above. log.SetLevel(log.DebugLevel) } func main() { log.WithFields(log.Fields{ "Animal": "Logrus", }).Info("A logrus appears") }
我只会看到错误。
写入日志失败,写入testlogrus.log:文件描述符错误
我得到的只是错误的文件描述符错误。有什么想法我做错了吗?
谢谢克雷格
由于您init已经在函数中设置了文件,并且拥有defer f.Close(),因此文件在init返回后将被关闭。
init
defer f.Close()
您要么必须保持文件打开状态,要么将整个文件移入main。