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
我注意到的几件事:
在第一行之后,没有显示任何内容。 999 是我得到的最后一个号码。它在 1000 行后停止并非巧合,但我无法解释原因。
我尝试使用不同的 X
值设置 time.sleep(X)
并且 X 大于 0.0001(如 X=1、X=0.01..),我得到了所有日志.
在测试之间,我有时会得到:
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
我正在设置 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
我注意到的几件事:
在第一行之后,没有显示任何内容。 999 是我得到的最后一个号码。它在 1000 行后停止并非巧合,但我无法解释原因。
我尝试使用不同的
X
值设置time.sleep(X)
并且 X 大于 0.0001(如 X=1、X=0.01..),我得到了所有日志.在测试之间,我有时会得到:
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