0

所以在我们的机器上,我们发现了一些奇怪的东西。我们的服务正常记录,但这些消息似乎被分组到特定大小的包中。例如,我们服务的一个命令仅在日志中生成 1 行。另一个命令生成大约 5 行。

使用journalctl -u service -f,单行只有在足够多的情况下才会显示,而5行的消息总是在您调用命令时立即显示。考虑这个例子:

我调用了 4 次短命令,但 journalctl 中没有显示任何内容。然后我调用较长的命令,所有 4 个短命令条目以及新的较长命令立即显示出来。但是,它们都具有基本完全相同的时间戳(考虑到写入速度),即使我间隔几秒钟发送调用它们!

[712708.862606] <hostname> <custom_service>[1020]: keys finished
[712708.902052] <hostname> <custom_service>[1020]: keys finished
[712708.902409] <hostname> <custom_service>[1020]: keys finished
[712708.902717] <hostname> <custom_service>[1020]: keys finished
[712708.903025] <hostname> <custom_service>[1020]: ERROR:JSONRPCTCP:Error calling handler db.keys
[712708.903377] <hostname> <custom_service>[1020]: ERROR:JSONRPCTCP:Request: {"jsonrpc": "2.0", "method": "db.keys", "id": "9fc6e420-4d6a-4654-a439-5c89fb4839a4"}
[712708.903730] <hostname> <custom_service>[1020]: ERROR:JSONRPCTCP:Traceback (most recent call last):
[712708.904100] <hostname> <custom_service>[1020]:   File "/opt/<product>/lib/python2.7/site-packages/<service>/server.py", line 321, in parse_call
[712708.904417] <hostname> <custom_service>[1020]:     response = handler(*params, **kwargs)
[712708.904729] <hostname> <custom_service>[1020]: TypeError: keys() takes at least 2 arguments (1 given)

这对于调试来说很棘手,因为您不能真正依赖消息实际发生时出现的消息。我在这里想念什么?有什么方法可以强制这些日志消息在实际发生时出现在 journalctl 中?

4

1 回答 1

0

它最终成为了真正的 python 服务。Python 通常以缓冲模式运行,将日志消息分批传送到 journald。使用 -u 您可以将 python 设置为无缓冲,这在很大程度上解决了这个问题。

在这里阅读更多内容:https ://unix.stackexchange.com/questions/285419/systemd-python-service-not-sending-all-output-to-syslog

于 2018-06-20T13:28:34.297 回答