使用Supervisor进行Python日志记录

4

我目前正在使用supervisor轻松地监控和守护一些Python脚本。然而,似乎supervisor无法正确记录日志。 我执行的脚本非常简单:

#!/usr/bin/env python
import pushybullet as pb
import sys, time, logging

# INIT LOGGING
logging.basicConfig(format='%(asctime)s @%(name)s [%(levelname)s]:    %(message)s', level = logging.DEBUG)

if __name__ == '__main__':
    try:
            logging.info('Custom service started')
            while True:
                    #here for the sake of example, actually doing real stuff here
                    time.sleep(2)
    finally:
            logging.info('Custom service stopped')

以下是相应的配置文件:

[program:myscript]
directory=/home/pi/Documents/Scripts_py
command=python -u myscript.py
autostart=true
autorestart=true

所以我基于对谷歌上的许多研究进行了许多测试。将日志行替换为打印并刷新stdout确实有效; 启动脚本时使用-u选项也是如此。但是,打印不符合我的需求,Python的日志记录模块很好用。因此,我尝试在每个日志行后刷新,并以无缓冲状态启动脚本,但是没有任何输出!

提前感谢任何帮助!


1
你试过在配置文件中指定你想要的日志文件吗? 比如:stdout_logfile=/var/log/supervisor/%(program_name)s.log - Pedro Rodrigues
这不是用来指定我们想让监管者输出程序自己的日志吗?如果是的话,它对我没有帮助,因为我面临的问题是我的脚本日志根本没有被监管者捕获。 - n0xew
好的,我尝试了一下,这就是解决方案,谢谢! - n0xew
1
是的,这是正确的(关于文件访问权限),尽管您可以在您的 supervisor 配置文件中指定 uid:user=youruser - Pedro Rodrigues
2个回答

5
感谢Pedro Rodrigues,我找到了解决方法。对于跟我一样遇到困难的人,只需要创建一个类似于这样的fileHandler即可:
fh = logging.FileHandler('/var/log/supervisor/your_program_name.log') 

并将以下内容添加到您的程序配置文件中:

stdout_logfile=/var/log/supervisor/%(program_name)s.log 

这些脚本将会写入日志,然后由监管程序读取,在Web界面上可见。可能会出现的一个问题是,如果您尝试在没有监管程序的情况下启动脚本,则可能会收到权限被拒绝的错误。


0

将你的shebang修改为以下内容:

#!/usr/bin/env -S python -u

这将禁用Python对stdout/stderr的缓冲。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接