python日志模块在Ansible模块中写入到哪里?

2024-10-04 01:34:13 发布

您现在位置:Python中文网/ 问答频道 /正文

当我运行ansible dnf模块时,dnf通过logging模块写入的消息似乎不会转到任何地方。为什么会这样?你知道吗


我有一个呼叫链,比如:

ansible(python3)->;ansible dnf模块->;import dnf。。。->;dnf插件etckeeper dnf

当前版本的etckeeperdnf继续运行etckeeper,使用os.system()。所以它写入stdout和confuses ansible。我假设这是etckeeperdnf中的一个错误。听起来像是另一个类似于dnf的插件,我不一定能修复。你知道吗

Ansible希望能够控制stdout/stderr,而不受库代码的干扰,这似乎是合理的。你知道吗

因此,我修补了etckeeperdnf,并将它的stdout+stderr有效地连接到pythonlogging模块。这正是我想要的。这是一个很好的解释。而dnf命令仍然显示所有etckeeper消息。(它们现在也被复制到/var/log/dnf.log)。你知道吗

但是现在我的阅读理解有问题。

当我运行ansible dnf模块时,dnf通过logging模块写入的消息(包括来自etckeeper dnf的消息)似乎不会转到任何地方。你知道吗

这不是我的零钱,不是我的错,也不是我需要的东西。我甚至测试了如果etckeeper失败会发生什么:etckeeperdnf只是继续,所以Ansible不会显示任何关于它的警告(除非我故意破坏Ansible)。你知道吗

但我不禁对任何警告信息都将丢失的想法感到不安。你知道吗

我确保使用dnfpluginscore.logger.error().info()进行测试,但在这两种情况下我都看不到消息。你知道吗

logging模块的默认配置是写入stderr。dnf模块不会对其进行任何配置,除非您使用dnf.cli.BaseCli。Ansible模块dnf.py不使用dnf.cli中的任何内容,也不使用logging执行任何操作。基类AnsibleModule也不使用python logging;它有自己独立的.log()方法。你知道吗

那么,为什么用.error()编写的消息不会出现在Ansible模块输出管道上,并再次中断Ansible呢?你知道吗

  • ansible-2.7.10-1.fc29.noarch公司
  • dnf-4.2.2-2.fc29.noarch公司
  • Python3-3.7.3-1.fc29.x86_

Tags: 模块gt插件log消息logging地方stderr
1条回答
网友
1楼 · 发布于 2024-10-04 01:34:13

原来的人把它弄坏了。然而,我们确定pythonlogging模块写入stderr。你知道吗

如果查看链接中的输出,Ansible将module_stdoutmodule_stderr分开。通常它只是忽略module_stderr;它只在MODULE FAILURE的情况下显示它。(尽管其他一些模块并不总是分开stdout/stderr,e.g. the Ansible ^{} module)。你知道吗

因此,我仍然认为etckeeper dnf提议的变化是合理的。不管Ansible dnf模块是如何故意这样设计的,依赖这种特定的行为似乎是相当合理的。更改后的代码不太可能被Ansible dnf模块中的未来更改破坏。你知道吗

我要注意的是,当您点击MODULE FAILURE时,module_stderr只显示dnf的错误消息。您看不到来自loglevel INFO或以下的任何消息,即dnf通常的非错误、非交互输出。你知道吗

如果在使用etckeeper dnf时将etckeeper失败视为致命的,那么使用.info()记录所有etckeeper输出可能不是一个好主意。Ansible将丢失来自etckeeper的原始错误消息(并且错误消息不会记录在其他任何地方)。你知道吗

但是,我在攻击etckeeper后测试了系统以返回EXIT_FAILURE。IIRC,dnf继续,无论是否出现任何etckeeper故障。总的来说,Ansible不会给您任何关于运行etckeeper失败的信息,不管我如何记录错误。一般来说,分别处理stdoutstderr消息更为复杂,而且会对消息的顺序产生奇怪的影响。所以我遵循了K.I.S.S.原则:-)。你知道吗


或者更笼统地说:

默认情况下,在loglevel INFO和以下级别编写的logging消息将毫无用处。日志级别警告和更高级别的消息将转到stderr。它们不会干扰Ansible模块的正常运行。在正常的Ansible模块操作中,即使这些消息也不会去任何地方。你知道吗

如果存在MODULE FAILURE—即模块崩溃或未生成Ansible可以按预期解析的JSON输出—Ansible将显示module_stderr,其中仅包含日志级别或更高级别的logging消息警告。你知道吗

相关问题 更多 >