Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Golang包中日志的正确实现_Go_Logging_Packaging_Software Design - Fatal编程技术网

Golang包中日志的正确实现

Golang包中日志的正确实现,go,logging,packaging,software-design,Go,Logging,Packaging,Software Design,我有一个做一些工作的小咕噜。这项工作假设可能会产生大量错误,这是正常的。目前所有错误都被忽略。是的,它可能看起来很奇怪,但请访问链接并检查包的主要用途。 我希望扩展包的功能,并提供查看运行时发生的错误的能力。但是由于缺乏软件设计技能,我有一些问题没有答案 首先,我想使用现有的日志记录(zerolog、zap或其他任何东西)在包内实现日志记录。但是,对软件包的用户来说可以吗?因为他们可能希望使用其他日志记录包,并希望修改输出格式。 也许可以为用户提供一种注入自己日志的方法 我希望能够为日志记录提供

我有一个做一些工作的小咕噜。这项工作假设可能会产生大量错误,这是正常的。目前所有错误都被忽略。是的,它可能看起来很奇怪,但请访问链接并检查包的主要用途。 我希望扩展包的功能,并提供查看运行时发生的错误的能力。但是由于缺乏软件设计技能,我有一些问题没有答案

首先,我想使用现有的日志记录(zerolog、zap或其他任何东西)在包内实现日志记录。但是,对软件包的用户来说可以吗?因为他们可能希望使用其他日志记录包,并希望修改输出格式。 也许可以为用户提供一种注入自己日志的方法


我希望能够为日志记录提供简单的可配置方式,用户可以根据需要打开或关闭日志记录。

一些go-lib使用这样的日志记录

在您的包中,有一个记录器接口

type Yourlogging interface{
      Errorf(...)
      Warningf(...)
      Infof(...)
      Debugf(...)
}
  var mylogger Yourlogging
  func SetLogger(l yourlogging)error{
       mylogger = l
  }
 for example:
     SetLogger(os.Stdout)    //logging output to stdout
     SetLogger(logrus.New()) // logging output to logrus  (github.com/sirupsen/logrus)
  
并为此接口定义一个变量

type Yourlogging interface{
      Errorf(...)
      Warningf(...)
      Infof(...)
      Debugf(...)
}
  var mylogger Yourlogging
  func SetLogger(l yourlogging)error{
       mylogger = l
  }
 for example:
     SetLogger(os.Stdout)    //logging output to stdout
     SetLogger(logrus.New()) // logging output to logrus  (github.com/sirupsen/logrus)
  
在func中,可以调用它们进行日志记录

  mylogger.Infof(..)

  mylogger.Errorf(...)
您不需要实现接口,但可以使用实现此接口的人员

type Yourlogging interface{
      Errorf(...)
      Warningf(...)
      Infof(...)
      Debugf(...)
}
  var mylogger Yourlogging
  func SetLogger(l yourlogging)error{
       mylogger = l
  }
 for example:
     SetLogger(os.Stdout)    //logging output to stdout
     SetLogger(logrus.New()) // logging output to logrus  (github.com/sirupsen/logrus)
  

在Go中,您将看到一些库像其他答案所建议的那样实现日志接口。但是,例如,如果以不同的方式构建应用程序,则可以完全避免包需要登录

例如,在链接的示例应用程序中,主应用程序运行时调用
idleexacts.Run()
,启动此函数

//StartOOP使用传递的设置和数据库连接启动工作负载。
func STARTOOP(ctx context.context、log log.Logger、pool db.db、tables[]字符串、作业uint16、minTime、maxTime time.Duration)错误{
rand.Seed(time.Now().UnixNano())
//由于rand.Int63n()从不返回最大值,因此将maxTime增量最多为1。
maxTime++
//运行时,保持所需数量的工人使用通道。
//只在有空闲时间之前运行新工人。
guard:=make(chan结构{},作业)
为了{
挑选{
//仅在可以写入通道时运行辅助进程(通道受作业数限制)。
护箱