SysLogHandler 丢失日志

SysLogHandler missing logs

我正在设置 SysLogHandler

我正在使用以下脚本:

#!/usr/bin/env python

import logging
from logging.handlers import SysLogHandler

handler_syslog = SysLogHandler(
    address="/dev/log",
    facility=SysLogHandler.LOG_DAEMON,
)

fmt0 = logging.Formatter(fmt="%(module)s: %(asctime)s - %(levelname)s - %(message).1000s")
handler_syslog.setFormatter(fmt0)

my_logger = logging.getLogger()
my_logger.setLevel(logging.DEBUG)
my_logger.addHandler(handler_syslog)

i = 0
while True:
    import time
    X = 0.0001
    time.sleep(X)
    logging.info(i)
    i += 1

我查看这里写入的日志:

tail -f /var/log/daemon.log

它给出:

Apr  1 20:10:41 fr-machine-01 syslogtest[28894]: 2022-04-01 20:10:41,527 - INFO - 993
Apr  1 20:10:41 fr-machine-01 syslogtest[28894]: 2022-04-01 20:10:41,528 - INFO - 994
Apr  1 20:10:41 fr-machine-01 syslogtest[28894]: 2022-04-01 20:10:41,528 - INFO - 995
Apr  1 20:10:41 fr-machine-01 syslogtest[28894]: 2022-04-01 20:10:41,528 - INFO - 996
Apr  1 20:10:41 fr-machine-01 syslogtest[28894]: 2022-04-01 20:10:41,529 - INFO - 997
Apr  1 20:10:41 fr-machine-01 syslogtest[28894]: 2022-04-01 20:10:41,529 - INFO - 998
Apr  1 20:10:41 fr-machine-01 syslogtest[28894]: 2022-04-01 20:10:41,529 - INFO - 999

我注意到的几件事:

  1. 在第一行之后,没有显示任何内容。 999 是我得到的最后一个号码。它在 1000 行后停止并非巧合,但我无法解释原因。

  2. 我尝试使用不同的 X 值设置 time.sleep(X) 并且 X 大于 0.0001(如 X=1、X=0.01..),我得到了所有日志.

  3. 在测试之间,我有时会得到:

    Apr  1 20:10:01 fr-machine-01 systemd-journald[461]: Suppressed 27344 messages from session-1492208.scope
    

总而言之,我想我已经达到了速率限制。但是我没有在网上找到任何关于它的信息。此外,这是一个示例测试,但让我注意到该错误的真实应用程序 运行 是一个慢得多的记录器(大约 1000 个日志/分钟)。

任何人都知道如何使用 SysLogHandler?

将所有日志导入该文件

我在Python之外找到了解决方案。

确实是速率限制问题。 systemd-journald 有 2 个参数,用于调节正在处理的日志数量。里面 /etc/systemd/journald.conf:

RateLimitIntervalSec=30s
RateLimitBurst=1000

这只允许每 30 秒处理 1000 个日志。如果收到太多消息,将丢弃更多消息,直到 30 秒的 window 结束。

要减少丢弃的日志数量,请升级 RateLimitBurst 或将两者都设置为 0。请注意,不建议将它们都设置为 0,因为存在速率限制以避免流氓程序也记录日志独占一台机器的资源(甚至破坏它)。

更新后,运行:

sudo systemctl restart systemd-journald

我发现 this and this 资源有用。