Telliot: 在任何地方使用一致的日志记录而不是 printf。

创建于 2020-09-26  ·  9评论  ·  资料来源: tellor-io/telliot

代码库在很多地方都有 printf 很容易开始,但是在解析或过滤日志时,它会在以后的监控和跟踪方面带来很多问题。

记录器应该在主包中初始化,然后传递给所有包构造函数。

这是一个非常好的日志包
github.com/go-kit/kit/log

有关如何实施的示例,请查看thanos 或 prometheus 项目。

所有注释掉的 printf-s 都可以替换为调试日志,以便仅在启用调试时显示这些日志。
level.Debug(logger).Log("msg", "debug")

重要的! 检查项目编码指南
https://github.com/tellor-io/telliot/blob/master/docs/coding-style-guide.md

good first issue help wanted .high

所有9条评论

我今天就拿这个!

更新:这部分完成了,但仍然有 printf 和 logrus 的几个地方。
TL-DR 需要到处使用 github.com/go-kit/kit/log。 它需要在初始化组件时作为参数传递。

问题状态:1.开放2. 开始 3. 提交 4. 完成


__这个问题现在有 0.1 ETH(114.26 美元 @ 1142.63 美元/ETH)的资金,作为 Tellor-io 基金的一部分。__

@krasi-georgiev 我想接受这个,但在阅读了你对 Gitcoin 的建议并阅读了 Telliot 代码后,我会说,而不是将所有注释掉的 fmt.Printf 更改为 level.Debug(logger).Log(... .) 我们应该根据每种情况决定从用户的角度来看什么更有意义。
当输出应该对检查问题有用时,我会使用日志调试,更多的是从开发人员的角度来看,但用户期望输出到控制台的情况应该是 INFO 级别。 例如
https://github.com/tellor-io/telliot/blob/master/pkg/ops/disputeOps.go#L249 -L255

    fmt.Printf("Dispute %s (%s):\n", dispute.DisputeId.String(), descString)
    fmt.Printf("    Accused Party: %s\n", reportedAddr.Hex())
    fmt.Printf("    Disputed by: %s\n", reportingMiner.Hex())
    fmt.Printf("    Created on:  %s\n", createdTime.Format("3:04 PM January 02, 2006 MST"))
    fmt.Printf("    Fee: %s TRB\n", util.FormatERC20Balance(uintVars[8]))
    fmt.Printf("    \n")
    fmt.Printf("    Value disputed for requestID %d:\n", dispute.RequestId.Uint64())

如果我错了,请纠正我。 谢谢!

是的,非常真实! 另一个规则是,日志在启动时发生一次,作为信息很好,但是如果它在循环中发生多次,除非在大多数情况下非常重要,否则噪音太大,应该进行调试。

@krasi-georgiev 是的,不要压倒用户是有意义的,但我认为在您想使用工具分析日志的情况下,改变行为可能会令人困惑,因为这是您对分析的唯一反馈,但无论如何我认为我们会得到正确的平衡。 我将在这里做一些改变,随着我对这个项目的了解更多,我们会发现什么对良好的用户体验有用。

一旦完成,还应该在同一个 PR 中添加一些更多的 linting 到 makefile 中,例如

go-lint: check-git deps $(GOLANGCI_LINT) $(FAILLINT)
    $(call require_clean_work_tree,'detected not clean master before running lint, previous job changed something?')
    <strong i="6">@echo</strong> ">> verifying modules being imported"
    @$(FAILLINT) -paths "errors=github.com/pkg/errors" ./...
    @$(FAILLINT) -paths "fmt.{Print,Printf,Println,Sprint}" -ignore-tests ./...
    <strong i="7">@echo</strong> ">> linting all of the Go files GOGC=${GOGC}"
    @$(GOLANGCI_LINT) run
    <strong i="8">@echo</strong> ">> ensuring Copyright headers"
    <strong i="9">@go</strong> run ./scripts/copyright
    $(call require_clean_work_tree,'detected files without copyright, run make lint and commit changes')

2 条 etra 线是:

    @$(FAILLINT) -paths "errors=github.com/pkg/errors" ./...
    @$(FAILLINT) -paths "fmt.{Print,Printf,Println,Sprint}" -ignore-tests ./...

这将强制在任何地方都没有打印语句,并且pkg/errors无处不在

问题状态:1. 开放 2. 开始 3.提交4. 完成


__工作已经开始__。

这些用户都声称他们可以在 265 年零 6 个月后完成这项工作。
请在下面查看他们的行动计划:

1) g33kidd已申请开始工作_(仅限资助者:批准工人|拒绝工人)_。

我会尝试一下,这似乎是一件有趣的事情。
2) voanhcung已申请开始工作_(仅限资助者:批准工人|拒绝工人)_。

好的 [email protected] ......................
3) therocketcat已获准开始工作。

我查看了代码库和您提到的前面提到的示例项目。

从我收集的示例中,如果使用 printf 的函数没有构造函数,那么记录器应该依赖注入到函数本身中。 如果情况并非如此,那么我想在那里澄清。

在主包 (telliot/cmd/telliot/main.go) 中,它们将使用 util 中的 SetupLogger 函数进行设置,并传递给构造函数或直接注入函数(作为第一个参数)。

同时查看代码库我找不到任何注释掉的 printfs,所以我假设你的意思是一般的 printfs?

如果我误解了任务 RocketCat#3507,可以进一步讨论这个问题
4) mendesfabio已申请开始工作_(仅限资助者:批准工人|拒绝工人)_。

我刚刚检查了 repo,似乎替换了一些 printf-s(它帮助我理解了如何去做)。 我们仍然有 10 个带有 printf-s 的文件,我会更改它。
5) rodrigoadriandiaz已申请开始工作_(仅限资助者:批准工人|拒绝工人)_。

我可以做到这一点,替换所有对 printf 的调用以实现上述日志记录包,我明天就可以开始工作了
6) raulcorreia7已申请开始工作_(仅限资助者:批准工人|拒绝工人)_。

你好,
这将是毫无意义的,
私信我。
7) coder4520已申请开始工作_(仅限资助者:批准工人|拒绝工人)_。

我想这将是非常好的第一个项目。
8) adiprerepa已申请开始工作_(仅限资助者:批准工人|拒绝工人)_。

这将非常容易 - 只需找到并将 printf 替换为日志记录,然后仔细检查。
9) xf3rno已申请开始工作_(仅限资助者:批准工人|拒绝工人)_。

我会执行请求的任务; 用谷歌的 golang 记录器库(非常轻量级:https://github.com/google/logger)替换所有当前日志记录,并根据上下文(调试、警告等)确定每条消息的范围。

在 Gitcoin 问题详细信息页面上了解更多

问题状态:1. 开放 2.开始3. 提交 4. 完成


__ 0.1 ETH (167.47 USD @ $1674.72/ETH) 的作品已由__提交:


此页面是否有帮助?
0 / 5 - 0 等级