django - 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。我正在向标准输出写入消息,如文档中所示。
解决方案
Python 正在缓冲写入标准输出的内容。有帮助的是设置环境变量PYTHONUNBUFFERED=1
在 Python 3.7 版本中,stdout 和 stderr 流的文本层现在是无缓冲的。
推荐阅读
- html - 导航栏下拉菜单在 Angular 12 bootstrap 5 中不起作用
- c - 将带有单间接运算符的指针作为指向多维数组的参数,如 arr[x][y][z]
- azure - 如何使用 for_each 将值从一个模块列表传递到另一个模块
- java - Elytron:如何以编程方式了解可能应用程序使用的 server-ssl-context 的详细信息?
- javascript - 如何安排 li 和删除 li 可用空间?
- python - Python,不能覆盖一个方法
- javascript - 如何在页面滚动gsap时更改CSS变量的值?
- java - 如何在 RESTful API 更新情况下解决 int 值为 null 的问题?
- java - Graphics2D 和用户移动设置
- php - 我想制作一个基本宽度是输入大小一半的箭头