为了账号安全,请及时绑定邮箱和手机立即绑定

关闭具有延迟关闭的文件

关闭具有延迟关闭的文件

Go
慕沐林林 2023-07-10 10:07:19
在我的主函数中,我打开一个日志文本文件进行写入,并使用延迟关闭方法在应用程序退出后将其关闭。但是,在每个新的一天开始时,我希望开始写入第二天的日志文件,并且我不知道如何关闭前一天的文件并开始写入当前的文件。在我的主要功能中:func main() {f, err := os.OpenFile("2019-07-24.txt", os.O_RDWR | os.O_CREATE | os.O_APPEND, 0644)    if err != nil {        log.Fatalf("Error opening log file: %v", err)    }    defer f.Close()    log.SetOutput(f)}现在,当我在新的一天收到另一个包裹中的消息时:func gateway() {f, err := os.OpenFile("2019-07-25.txt", os.O_RDWR | os.O_CREATE | os.O_APPEND, 0644)    if err != nil {        log.Fatalf("Error opening log file: %v", err)    }    defer f.Close()    log.SetOutput(f)}如何从另一个包获取指向前一天日志文件的指针,然后将其关闭(除非应用程序完全关闭,否则不会调用延迟调用?
查看完整描述

1 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

创建一个管理日志输出的包。


package logoutput


package main


import (

    "io"

    "log"

    "sync"

)


var (

    mu            sync.Mutex

    curr io.WriteCloser

)


func Set(w io.WriteCloser) {

    mu.Lock()

    defer mu.Unlock()

    prev := curr

    curr = w

    log.SetOutput(curr)

    if prev != nil {

       prev.Close()

    }

}


func Close() {

    mu.Lock()

    defer mu.Unlock()

    log.SetOutput(os.Stderr) // revert to default

    if curr != nil {

       curr.Close()

    }

    curr = nil

}

从 main 和 gateway 包中调用该包。


f, err := os.OpenFile("2019-07-24.txt", os.O_RDWR | os.O_CREATE | os.O_APPEND, 0644)

if err != nil {

    log.Fatalf("Error opening log file: %v", err)

}

logoutput.Set(f)

defer logoutput.Close() // call from main only


查看完整回答
反对 回复 2023-07-10
  • 1 回答
  • 0 关注
  • 120 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信