Journalctl регистрирует сообщения в группах?

Так что на наших машинах мы заметили что-то странное. Наши службы регистрируются нормально, но эти сообщения, похоже, сгруппированы в пакеты определенного размера. Например, одна команда нашего сервиса генерирует только 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, когда они действительно происходят?

1 ответ

Это закончило тем, что было фактическим обслуживанием питона. Python обычно работает в буферизованном режиме, который доставляет сообщения журнала партиями в journald. С -u вы можете установить python в unbuffered, что в значительной степени решает проблему.

Больше читать здесь: https://unix.stackexchange.com/questions/285419/systemd-python-service-not-sending-all-output-to-syslog

Другие вопросы по тегам