go - 如何在 macOS 上的 logrus/lumberjack 中自动重新创建日志文件

标签 go logrus

我在 macOS 上使用 logruslumberjack 作为日志文件。

logger := &lumberjack.Logger{
    // Log path
    Filename: filepath.Join(logFolder, "xxx.log"),
    // Log size MB
    MaxSize: 10,
    // Backup count
    MaxBackups: 3,
    // expire days
    // MaxAge: 28,
    // gzip compress
    Compress: false,
}
logrus.SetOutput(logger)

当我启动我的应用程序时,它将按预期创建日志文件。
但是,当我的应用程序运行时,我手动删除日志文件,因为我的应用程序继续运行,我希望它会重新创建日志文件,但是,日志文件没有创建。
但如果我重新启动我的应用程序,日志文件将再次创建。
那么我应该怎么做才能让我的应用程序(继续运行)在删除日志文件时重新创建并写入日志文件。

提前致谢。

最佳答案

这是使用 fsnotify lib 监视日志文件的另一种方法。 fsnotify 监控 xxx.log 所在目录,当 xxx.log 被删除时告诉 lumberjack Rotate()

import (
    "fmt"
    "log"
    "path/filepath"
    "time"

    "github.com/fsnotify/fsnotify"
    "gopkg.in/natefinch/lumberjack.v2"
)

func main() {
    logPath := "./xxx.log"
    logName := filepath.Base(logPath)

    logger := &lumberjack.Logger{
        // Log path
        Filename: logPath,
        // Log size MB
        MaxSize: 10,
        // Backup count
        MaxBackups: 3,
        // expire days
        // MaxAge: 28,
        // gzip compress
        Compress: false,
    }

    watcher, err := fsnotify.NewWatcher()
    if err != nil {
        log.Fatal(err)
    }
    defer watcher.Close()

    go func() {
        for event := range watcher.Events {
            if event.Op&fsnotify.Remove == fsnotify.Remove &&
                event.Name == logName {
                log.Println("rotate log", event.Name)
                logger.Rotate()
            }
        }
    }()

    err = watcher.Add(filepath.Dir(logPath))
    if err != nil {
        log.Fatal(err)
    }

    for {
        logger.Write([]byte(fmt.Sprintf("current time:%v\n", time.Now())))
        time.Sleep(3 * time.Second)
    }
}

关于go - 如何在 macOS 上的 logrus/lumberjack 中自动重新创建日志文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69796031/

相关文章:

go - 使用模型数组中的选项渲染 SelectTag()

go - 处理程序服务后,如何从请求对象取回记录器对象?

reflection - 使用可嵌入结构的通用函数

memory - Go: time.sleep 和内存使用

multithreading - 多人围棋程序

go - 写入现有文件

Golang TCP 服务器 - 在客户端之间交换数据

go - runtime.Callers 根据运行的位置打印不同的程序计数器

go - 是否可以使用 logrus 日志记录将 'msg' 交换为 'message'