关闭延迟关闭的文件

詹姆斯·范·齐尔:

在我的主要功能中,我打开了一个日志文本文件,使用defer close方法编写该文件,以在应用程序退出后将其关闭。但是,在每个新的一天开始时,我希望开始写入第二天的日志文件,而且我不知道如何关闭前一天的文件并开始写入当前的文件。

在我的主要职能中:

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)

}

我如何从另一个包中获取指向前一天日志文件的指针,然后将其关闭(当除非应用程序完全关闭时才调用延迟调用)?

松饼上衣:

创建一个用于管理日志输出的程序包。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章