记录 Python Systemd 输出到日志文件
Log Python Systemd output to log file
我运行我的python脚本作为systemd服务,它在下面的.service
文件中定义:
[Unit]
Description=MyService
After=multi-user.target
[Service]
Type=idle
ExecStart=/usr/bin/python3 /home/username/projects/website_notifier/run_service.py
[Install]
After=multi-user.target
在我的 run_service.py 文件中,我使用日志模块记录输出:
import logging
logging.basicConfig(filename=settings['log_file_name'], level=logging.INFO)
logging.info("Starting notifier service at " + str(datetime.utcnow()))
问题是当我 运行 通过 systemctl
启动我的文件时,此信息没有记录到我的日志文件中
现在,我知道 systemd 通常会将输出输出到 journalctl,我不想要这个。我希望能够通过另一个没有 运行 管理员权限的脚本访问此日志。
我怎样才能做到这一点?
首先检查您的服务是否完全 运行:systemctl status MyService
应该向您显示错误。
After
进入 [Unit]
部分,而不是 [Install]
.
一旦我确定你的脚本对我有用。其他要检查的事项:
- 日志文件路径是绝对路径吗?
- 启动服务的用户是否有在那里写的权限?
我建议只记录到标准输出、日志,这样您就不必担心日志文件的轮换、需要多少 space 等等。还有 journalctl
非常适合查询日志。您应该能够以非 root 用户身份访问日志,可以作为与脚本相同的用户,或者在组 systemd-journal
.
中
答案很简单,logging.info
不会出现,但 logging.warn
(及以上)会出现。
我已经改用 Loguru 进行日志记录,它似乎更加直观和实用。
此外,将以下内容添加到 .service
文件可确保日志记录没有缓冲并且是实时的:
[Service]
Environment=PYTHONUNBUFFERED=1
我运行我的python脚本作为systemd服务,它在下面的.service
文件中定义:
[Unit]
Description=MyService
After=multi-user.target
[Service]
Type=idle
ExecStart=/usr/bin/python3 /home/username/projects/website_notifier/run_service.py
[Install]
After=multi-user.target
在我的 run_service.py 文件中,我使用日志模块记录输出:
import logging
logging.basicConfig(filename=settings['log_file_name'], level=logging.INFO)
logging.info("Starting notifier service at " + str(datetime.utcnow()))
问题是当我 运行 通过 systemctl
现在,我知道 systemd 通常会将输出输出到 journalctl,我不想要这个。我希望能够通过另一个没有 运行 管理员权限的脚本访问此日志。
我怎样才能做到这一点?
首先检查您的服务是否完全 运行:systemctl status MyService
应该向您显示错误。
After
进入 [Unit]
部分,而不是 [Install]
.
一旦我确定你的脚本对我有用。其他要检查的事项:
- 日志文件路径是绝对路径吗?
- 启动服务的用户是否有在那里写的权限?
我建议只记录到标准输出、日志,这样您就不必担心日志文件的轮换、需要多少 space 等等。还有 journalctl
非常适合查询日志。您应该能够以非 root 用户身份访问日志,可以作为与脚本相同的用户,或者在组 systemd-journal
.
答案很简单,logging.info
不会出现,但 logging.warn
(及以上)会出现。
我已经改用 Loguru 进行日志记录,它似乎更加直观和实用。
此外,将以下内容添加到 .service
文件可确保日志记录没有缓冲并且是实时的:
[Service]
Environment=PYTHONUNBUFFERED=1