在不同文件

时间:2017-12-06 13:09:07

标签: logging go

我使用logrus logger并在主函数中初始化它,如下面的

main.go file content


import "github.com/sirupsen/logrus"

var logger                *logrus.Logger

func init() {

    logger = utils.InitLogs()
}



func main(){

    logger.Info("bla bla")

   } 

我能够在主文件中使用它,例如{。{1}},现在我不想在每个文件中创建logger.info(“test”)文件 其他需要使用记录器的文件,我想在其他项目文件中使用我在main.go文件中创建的同一个实例 我该怎么做才打高尔夫?

我不是要求在同一个包装上分享

1 个答案:

答案 0 :(得分:1)

这里有一些观点:

在包概念中转到组文件,例如,如果在package main的目录中有一些.go文件,这意味着所有文件都在共享包范围,在这种情况下,func init()进入var logger包中存在的main

我更喜欢不使用包范围变量,但这取决于您的实现 https://dave.cheney.net/2017/06/11/go-without-package-scoped-variables

也许您想在不同的包中使用记录器,例如github.com/youruser/work

我更喜欢将对象日志传递给您想要使用它的函数或方法(作为参数或接收器)

package main

import (
    "github.com/user/utils"
    "github.com/user/work"
)

func main() {
    logger := utils.InitLogs()
    work.Do(logger)
}

或使用作为接收者

package main

import (
    "github.com/user/utils"
    "github.com/user/work"
)

func main() {
    logger := utils.InitLogs()
    w := work.New()
    w.Log = logger
    w.Do()
}

然后在Do()中你可以使用接收器

进行记录

在工作包中,您应该将其添加为提交

type Worker struct {
    Log *logrus.Logger
}

我真的希望你能发现它很有用。

<强>更新 工作包的一个例子

package work

import "github.com/sirupsen/logrus"

type Worker struct {
    Log *logrus.Logger
}

func New() *Worker {
    return new(Worker)
}

func (w *Worker) Do() {
    // some work
    // Here you are passing as receiver parameter
    w.Log.Info("bla bla")
}

func AnotherFunc(log *logrus.Logger) {
    // Here you are passing as method parameter
   log.Info("bla bla")
}