猿问

在 golang 中记录到文件

我从 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:文件描述符错误


我得到的只是错误的文件描述符错误。任何想法我做错了什么?


摇曳的蔷薇
浏览 309回答 3
3回答

饮歌长啸

由于您在init函数中设置了文件并且您拥有defer f.Close(),因此文件在init返回后会关闭。您要么必须保持文件打开状态,要么将整个文件移动到主文件中。

牛魔王的故事

如果您使用 logrus,您应该更好地使用文档推荐的钩子。有关示例,请参见:https : //github.com/rifflock/lfshook。在我看来,将整个事情移到主要内容通常不是一个好主意,相反,我们需要分段良好的代码。

慕侠2389804

在 Linux 开发中,您可以写入 stdout 并通过管道传输到文件。在生产中写入系统日志。两种方式您都不需要自己处理文件。
随时随地看视频慕课网APP

相关分类

Go
我要回答