我使用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文件中创建的同一个实例
我该怎么做才打高尔夫?
我不是要求在同一个包装上分享
答案 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")
}