如何在golang中将日志写入多个日志文件?

8

我正在编写一个应用程序,需要在两个不同的文件中记录日志。例如 weblogs.go 和 debuglogs.go。我尝试使用 log4go,但我的要求是需要在主文件中创建日志记录器,并在子目录中访问它,因为大部分解码和日志记录工作都是在子文件中完成的。有人可以帮忙吗?


https://www.scalyr.com/blog/go-logging, https://github.com/sirupsen/logrus, https://dev59.com/2V0a5IYBdhLWcg3wfYw6 - sulabh chaturvedi
在https://awesome-go.com/#logging上,您可以找到流行的日志记录包列表。 - IhtkaS
1
什么阻止你将日志记录器从主函数传递到需要它们的地方?不清楚你需要什么帮助。 - Peter
@Peter 我在父级包的主函数中声明了我的日志记录器,我想在子目录中访问相同的日志记录器变量。由于无法导入主程序,我找不到方法使我的日志记录器变量可被子包访问。 - Madhuri Desai
1
记录器只是值。你可以通过函数参数或结构字段将它们向下传递。如果你真的想使用全局变量,那就创建一个被导入的新包,并在main函数中初始化它。 - Peter
2个回答

7

这是一种使用标准的log包来实现的方法:

package main

import (
    "io"
    "log"
    "os"
)

func main() {
    f1, err := os.Create("/tmp/file1")
    if err != nil {
        panic(err)
    }
    defer f1.Close()

    f2, err := os.Create("/tmp/file2")
    if err != nil {
        panic(err)
    }
    defer f2.Close()

    w := io.MultiWriter(os.Stdout, f1, f2)
    logger := log.New(w, "logger", log.LstdFlags)

    myfunc(logger)
}

func myfunc(logger *log.Logger) {
    logger.Print("Hello, log file!!")
}

注释:

  1. io.MultiWriter 用于将几个写入器组合在一起。在这里,它创建了一个写入器 w - 向 w 写入的内容将会被同时输出到 os.Stdout 和两个文件。
  2. log.New 允许我们使用自定义的写入器来创建一个新的 log.Logger 对象
  3. log.Logger 对象可以传递给函数并由它们用于记录事情

1

这是如何使用多个日志文件管理调试和生产环境的方法:

首先,创建一个用于管理多个记录器的类型,你可以创建一个独立的文件,例如 logging.go

type LOGGER struct {
        debug *log.Logger
        prod  *log.Logger
        .
        .
        .
    }

要在项目的任何地方获取LOGGER指针,最好的方法是通过单例模式获取它。

    var lock = &sync.Mutex{}
    var loggers *LOGGER

    func GetLoggerInstance() *LOGGER {
      lock.Lock()
      defer lock.Unlock()

    if loggers == nil {
      fmt.Println("Creating LOGGER instance now.")
      loggers = &LOGGER{} 
    } else {
        fmt.Println("LOGGER instance already created.")
    }

    return loggers
}
    

现在为任何包或目录级别的调试环境设置日志记录器,最好是在根级别设置。
    logger := GetLoggerInstance()
    f, err := os.OpenFile("path/to/debug/log/file", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
    if err != nil {
        fmt.Println("debug log file not created", err.Error())
    }
    loggers.debug = log.New(f, "[DEBUG]", log.Ldate|log.Ltime|log.Lmicroseconds|log.LUTC)

    loggers.debug.Println("This is debug log message")


用相同的方法,你也可以创建生产环境或者任意数量的环境。
    logger := GetLoggerInstance()
    f, err = os.OpenFile("path/to/prod/log/file", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
    if err != nil {
        fmt.Println("prod log file not created", err.Error())
    }
    loggers.prod = log.New(f, "[PROD]", log.Ldate|log.Ltime|log.Lmicroseconds|log.LUTC)

    loggers.prod.Println("This is prod log message")


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接