登录
首页 >  Golang >  Go问答

如何将日志写入文件

来源:Golang技术栈

时间:2023-04-10 10:28:22 317浏览 收藏

你在学习Golang相关的知识吗?本文《如何将日志写入文件》,主要介绍的内容就涉及到golang,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实战操作都是不可或缺的哦!

问题内容

我正在尝试使用 Go 写入日志文件。

我尝试了几种方法,但都失败了。这是我尝试过的:

func TestLogging(t *testing.T) {
    if !FileExists("logfile") {
        CreateFile("logfile")
    }
    f, err := os.Open("logfile")
    if err != nil {
        t.Fatalf("error: %v", err)
    }

    // attempt #1
    log.SetOutput(io.MultiWriter(os.Stderr, f))
    log.Println("hello, logfile")

    // attempt #2
    log.SetOutput(io.Writer(f))
    log.Println("hello, logfile")

    // attempt #3
    log.SetOutput(f)
    log.Println("hello, logfile")
}

func FileExists(name string) bool {
    if _, err := os.Stat(name); err != nil {
       if os.IsNotExist(err) {
            return false
        }
    }
    return true
}

func CreateFile(name string) error {
    fo, err := os.Create(name)
    if err != nil {
        return err
    }
    defer func() {
        fo.Close()
    }()
    return nil
}

日志文件被创建,但没有任何内容被打印或附加到它上面。为什么?

正确答案

os.Open()过去一定有不同的工作方式,但这对我有用:

f, err := os.OpenFile("testlogfile", os.O_RDWR | os.O_CREATE | os.O_APPEND, 0666)
if err != nil {
    log.Fatalf("error opening file: %v", err)
}
defer f.Close()

log.SetOutput(f)
log.Println("This is a test log entry")

基于 Go 文档,os.Open()不能为 工作log.SetOutput,因为它打开文件“用于阅读:”

func Open

func Open(name string) (file *File, err error) Open打开命名文件进行读取。如果成功,则可以使用返回文件上的方法进行读取;关联的文件描述符有 mode O_RDONLY。如果有错误,它将是类型*PathError

编辑

检查defer f.Close()后移至if err != nil

到这里,我们也就讲完了《如何将日志写入文件》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于golang的知识点!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表