首页 > 解决方案 > Systemd:在脚本执行结束时记录消息

问题描述

我有 Django 站点,该站点具有自定义管理命令,每 5 分钟将数据从一个系统同步到数据库。在该命令的脚本中有多个日志消息。当我手动执行命令时,一切正常,并且每个日志消息都按原样输出到 stdout/stderr。这里没问题。

为了每 5 分钟运行一次命令,我设置了 systemd 服务和计时器,它在处理一件小事时应该正常工作。来自脚本的所有消息都在脚本执行结束时记录在 systemd 中,而不是在它们发生时。该脚本通常运行大约一分钟,并且随着脚本中的每个子任务结束,偶尔会输出日志消息。就我而言,systemd 记录所有消息,就好像它们同时发生一样,更准确地说是在执行结束时。

所以,日志看起来像这样,并注意消息的时间戳。

Jul 16 09:20:01 SmallServer systemd[1]: Started DjngoSite Sync daemon.
Jul 16 09:20:40 SmallServer python[21265]: Task 1 completed
Jul 16 09:20:40 SmallServer python[21265]: Task 2 completed
Jul 16 09:20:40 SmallServer python[21265]: Task 3 completed
Jul 16 09:20:40 SmallServer python[21265]: Task 4 completed
Jul 16 09:20:40 SmallServer python[21265]: Sync ended

但是,我想看起来像这样:

Jul 16 09:20:01 SmallServer systemd[1]: Started DjngoSite Sync daemon.
Jul 16 09:20:11 SmallServer python[21265]: Task 1 completed
Jul 16 09:20:15 SmallServer python[21265]: Task 2 completed
Jul 16 09:20:22 SmallServer python[21265]: Task 3 completed
Jul 16 09:20:39 SmallServer python[21265]: Task 4 completed
Jul 16 09:20:40 SmallServer python[21265]: Sync ended

我不知道这个问题是 systemd 还是 Django。我正在向标准输出写入消息,如文档中所示。

标签: djangologgingservicesystemd

解决方案


Python 正在缓冲写入标准输出的内容。有帮助的是设置环境变量PYTHONUNBUFFERED=1

在 Python 3.7 版本中,stdout 和 stderr 流的文本层现在是无缓冲的。


推荐阅读