登录到golang中的文件

登录到golang中的文件,go,Go,我从golang开始,当我开始构建我的应用程序时,我想从一开始就添加日志记录,这就是我遇到问题的地方 如果我打开一个文件并使用标准日志库,我就能够写入一个文件。像这样 package main import ( "os" "fmt" "log" ) func main() { // open a file f, err := os.OpenFile("test.log", os

我从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这样

    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中为生产创建日志文件好吗?