代码库在很多地方都有 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
我今天就拿这个!
更新:这部分完成了,但仍然有 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)替换所有当前日志记录,并根据上下文(调试、警告等)确定每条消息的范围。
问题状态:1. 开放 2.开始3. 提交 4. 完成
__ 0.1 ETH (167.47 USD @ $1674.72/ETH) 的作品已由__提交: