登录到golang中的文件
我从golang开始,当我开始构建我的应用程序时,我想从一开始就添加日志记录,这就是我遇到问题的地方 如果我打开一个文件并使用标准日志库,我就能够写入一个文件。像这样登录到golang中的文件,go,Go,我从golang开始,当我开始构建我的应用程序时,我想从一开始就添加日志记录,这就是我遇到问题的地方 如果我打开一个文件并使用标准日志库,我就能够写入一个文件。像这样 package main import ( "os" "fmt" "log" ) func main() { // open a file f, err := os.OpenFile("test.log", os
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这样
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:错误的文件描述符
我得到的只是错误的文件描述符错误。你知道我做错了什么吗
谢谢
Craig由于您在
init
函数中设置了文件,并且您有延迟f.Close()
,文件在init
返回后关闭
您要么保持文件打开,要么将整个文件移到主文件中。在Linux上
在开发中,您可以写入标准输出,并通过管道写入文件。
在生产中写入syslog。
这两种方法都不需要自己处理文件。如果使用logrus,最好使用文档推荐的挂钩 参见:示例
在我看来,将整个内容移到主视图通常不是一个好主意,相反,我们需要的是分段良好的代码。Nice!就这样。go中的最佳实践是将日志初始化从init移动到main,还是只保持日志文件打开而不显式关闭?@Craig我只是将其移动到main,因为如果在退出时不关闭它,可能会丢失文件末尾的几个字节。另外,请查看与/g类似的s/Linux/unix或更好的
s/Linux/sane OS/g
在/var/log/myAppLog.log中为生产创建日志文件好吗?