当前位置: 首页 > 面试题库 >

记录到golang中的文件

何玺
2023-03-14
问题内容

我从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返回后将被关闭。

您要么必须保持文件打开状态,要么将整个文件移入main。



 类似资料:
  • 问题内容: 我可以将所有消息定向到log.txt文件: 但是我也如何在控制台中获取日志消息? 问题答案: 使用 MultiWriter创建一个写入器,该写入器将其写入复制到所有提供的写入器中,类似于Unix tee(1)命令

  • 问题内容: 我有一个Main应用程序和多个工作程序节点,它们在领事中注册。我想通过负载平衡将数据发送到工作节点。使用congo的golang API,我可以在主应用程序上获得可用的服务。 但是,我无法在golang应用程序中获取DNS SRV记录。 如该线程中所述,如何在go应用程序中读取领事SRV记录?,我尝试了github.com/miekg/dns,但没有成功。另外,我尝试使用github.

  • 问题内容: 我有一个dropwizard应用程序,在该应用程序中,我配置了logger附加程序,使其文件如下: 并且,在我的应用中创建了记录器: 在main()中进行一些测试记录: 该应用程序启动并运行没有问题。但是我没有在stdout或mylogs.log文件中得到任何日志(当然,除了Jetty访问日志之外,这些日志也已正确打印到mylogs.log中)。相反,如果我删除configuratio

  • 问题内容: 我需要将对项目中的Oracle数据库的所有查询记录到日志文件中。 有什么 好的 解决方案来实现这一目标?一些示例用法将不胜感激。 我已经用jdbcdslog查看了SLF4J,但不确定如何使用它登录到文件。而且,我需要“过滤”一些日志(因为我不需要知道何时调用某种方法) 最好是,我更愿意使用,但这不是必需的。 谢谢。 更新 我找到了这篇Oracle文章,但是它并没有真正告诉您如何以编程方

  • 如果我错了,请纠正我。。拼花文件是自描述的,这意味着它包含正确的模式。 我想使用S3接收器融合连接器(特别是因为它正确处理了S3的精确一次语义)从我们的Kafka中读取JSON记录,然后在s3中创建拼花文件(按事件时间分区)。我们的JSON记录没有嵌入模式。 我知道它还不被支持,但我对拼花地板和AVRO也有一些问题。 由于我们的JSON记录中没有嵌入模式,这意味着连接器任务必须从它自己的JSON字