当前位置: 首页 > 知识库问答 >
问题:

Golang go-workers定制日志中间件?

卫逸春
2023-03-14

我正在构建一个Golang应用程序,它实现了一个与Sidekiq兼容的Jrallison/Go-Workers工作队列和一个围绕Sirupsen/Logrus的定制日志包装器,用于封送的JSON日志。

现在,我的所有应用程序(到目前为止go-workers除外)都在中心位置使用我的记录器包装器,以确保其输出100%与JSON兼容。

请注意,第1行和第2行是来自中央记录器的正确JSON,但是当go-workers初始化时,我们会看到第3行以纯文本形式来自错误的记录器。

{"db":{"Mapper":{}},"instance_id":"1","level":"info","msg":"Db: Connected to MySQL","time":"2015-05-27T04:15:15-04:00"}
{"concurrency":10,"instance_id":"1","level":"info","msg":"Worker: Commencing work","time":"2015-05-27T04:15:15-04:00"}
workers: 2015/05/27 04:15:15.211217 processing queue contact with 10 workers.
^C
workers: 2015/05/27 04:15:17.197504 quitting queue contact (waiting for 0 / 10 workers).
{"instance_id":"1","level":"info","msg":"Closed correctly","time":"2015-05-27T04:15:17-04:00"}

我似乎无法让这个自定义的MiddlewareLogging来取代go-workers缺省的日志中间件。

func (a *App) ConfigureWorkers() {
  workers.Middleware = workers.NewMiddleware(
    &WorkMiddleware{ App: a },
    )
}

type WorkMiddleware struct{
  App *App
}

func (m *WorkMiddleware) Call(queue string, message *workers.Msg, next func() bool) (acknowledge bool) {
  // before each message is processed:
  job_json := message.Args().GetIndex(0).MustString()
  job := ContactJob{}
  err := json.Unmarshal([]byte(job_json), &job)
  if err != nil {
  m.App.Log.WithFields( log.Fields{
    "job_json": job_json,
    }).Fatal("Worker: Could not Unmarshal job JSON")
    return
  }
  SetMessageJob(message, job)
  start := time.Now()
  m.App.Log.WithFields( log.Fields{
    "job_id": message.Jid(),
    "queue": queue,
    "args": message.Args(),
    }).Print("Work: Job Starting")
  defer func() {
    if e := recover(); e != nil {
      buf := make([]byte, 4096)
      buf = buf[:runtime.Stack(buf, false)]
      m.App.Log.WithFields( log.Fields{
          "job_id": message.Jid(),
          "queue": queue,
          "duration": time.Since(start),
          "error": e,
          "stack": buf,
        }).Fatal("Work: Job Failed")
    }
  }()
  acknowledge = next()
  result := GetMessageResult(message)
  m.App.Log.WithFields( log.Fields{
    "job_id": message.Jid(),
    "result": result,
    "queue": queue,
    "duration": time.Since(start),
    }).Print("Work: Job Done")
  return
}

是否真的可以为这些行替换默认的go-workers日志中间件?

共有1个答案

程钧
2023-03-14

引用jrallison来自github.com/jrallison/go-workers/issues/50:

看起来您正在替换工作日志中间件(它记录工作人员处理的每一条消息的信息)。

我在输出中看到的唯一日志记录是在启动和关闭时从管理器中登录的处理/退出日志条目。

func (a *App) ConfigureWorkers() {
  workers.Middleware = workers.NewMiddleware( &WorkMiddleware{ App: a } )
  workers.Logger = &WorkersLogger{ App: a }
}

type WorkersLogger struct {
  App *App
}

func (l *WorkersLogger) Println(args ...interface{}) {
  l.App.Log.WithFields( log.Fields{
    "instanceId": l.App.Id,
    }).Println(args...)
}

func (l *WorkersLogger) Printf(fmt string, args ...interface{}) {
  l.App.Log.WithFields( log.Fields{
    "instanceId": l.App.Id,
    }).Printf(fmt, args...)
}
 类似资料:
  • Logger(日志) 中间件 Logger 中间件记录了每一个请求的信息。 用法 e.Use(middleware.Logger()) 输出样例 {"time":"2017-01-12T08:58:07.372015644-08:00","remote_ip":"::1","host":"localhost:1323","method":"GET","uri":"/","status":200,

  • 我使用Spring JDBCTemplate来执行SQL查询。当日志级别< code > org . spring framework . JDBC . core . JDBC template 设置为< code>DEBUG时,每次触发查询时都会记录SQL语句。 问题是我有一些查询被触发了数百次。因此,应用程序日志充满了相同查询的重复日志,所有其他日志语句被完全淹没,使得日志难以理解。 有没有什

  • 嘿,我想知道控制台中的输出是否可能与文件输出中的输出相同。 这是我的XML配置。 滚动文件中的输出 在控制台中为空。但是现在如果我改变 到"追踪" 将是2,4,6。。。。在控制台和我的文件中,它将是1,3,5,7。。。这很容易理解。 但是我的问题是,我们如何在控制台和文件中同时拥有相同的日志级(跟踪)输出?(添加包名称和级别的标签不起作用) 与此问题相关: log4j2 xml配置-登录到文件和控

  • partition/data只有15G,kafka日志文件夹是-/data/var/kafka/kafka-logs data/var/kafka/kafka-logs下的大多数文件夹大小为4K-40K 但两个文件夹的大小非常大--5G-7G,这导致/数据是100%

  • 概述 首先同步下项目概况: 上篇文章分享了,规划项目目录和参数验证,其中参数验证使用的是 validator.v8 版本,现已更新到 validator.v9 版本,最新代码查看 github 即可。 这篇文章咱们分享:路由中间件 - 日志记录。 日志是特别重要的一个东西,方便我们对问题进行排查,这篇文章我们实现将日志记录到文本文件中。 这是我规划的,需要记录的参数: - request 请求数据

  • 任意逻辑 大家好,我想在日志中删除前20天的数据。表示模拟应在t=0时开始,但从第20天起开始收集日志中的数据。 有人知道这是怎么回事吗? 提前感谢您的帮助:-)