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

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

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

Go
慕尼黑的夜晚无繁华 2023-06-12 10:00:15
我正在编写一个应用程序,我需要在其中记录两个不同文件中的日志。例如weblogs .go 和debuglogs.go。我尝试使用log4go,但我的要求是我需要在主文件中创建记录器,并且可以在子目录中访问,因为主要的解码和记录是在子文件中完成的。有人可以帮忙吗?
查看完整描述

2 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

这是使用标准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对象可以传递给函数并由它们用来记录事物


查看完整回答
反对 回复 2023-06-12
?
Helenr

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

这就是您如何使用多日志文件管理用于调试和生产环境的日志:


首先,创建一个用于管理多个记录器的类型,您可以为此创建一个单独的文件,例如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

}

    

现在在任何 pkg 或目录级别为调试环境设置记录器更好的方法是在根级别设置它


    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")


使用相同的方法,您还可以创建 prod 或任意数量。


    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")


查看完整回答
反对 回复 2023-06-12
  • 2 回答
  • 0 关注
  • 258 浏览
慕课专栏
更多

添加回答

举报

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