在子进程日志记录中使用supervisord生成的进程名称

时间:2014-06-13 15:14:44

标签: python logging supervisord

我想在子进程记录中使用子进程的名称(例如“mysuperservice_1”,“mysuperservice_2”等等)。使用python构建的服务。

我该怎么办? TIA! =)

EDIT1

我的supervisord配置如下:

[program:superservice]
command = python manage.py superservice
process_name=%(program_name)s_%(process_num)s
autostart=true
autorestart=true
numprocs=4
stdout_logfile=spool/logs/superservice.log
stderr_logfile=spool/logs/superservice.error.log

它将产生这样的过程:

dizpers   4912  0.3  0.5 170472 21976 ?        Sl   22:09   0:00 python manage.py superservice
dizpers   4913  0.3  0.5 170476 22520 ?        Sl   22:09   0:00 python manage.py superservice
dizpers   4920  0.2  0.5 170476 22524 ?        Sl   22:09   0:00 python manage.py superservice
dizpers   4926  0.3  0.5 170476 22432 ?        Sl   22:09   0:00 python manage.py superservice

所以,我不能简单地获取进程名称(例如,通过 psutil 模块)。我需要以某种方式通过supervisord。

2 个答案:

答案 0 :(得分:5)

如果您没有使用multiprocessing,则流程名称通常始终为MainProcess。要覆盖它,您可以将过滤器添加到适当的处理程序,其工作方式如下:

import os, logging
class SupervisorProcessFilter(logging.Filter):
    def filter(self, record):
        record.processName = os.environ['SUPERVISOR_PROCESS_NAME']
        return True

然后在格式字符串中使用%(processName),正如Hai Vu建议的那样。

答案 1 :(得分:1)

在主代码中,您使用%(processName)配置日志记录格式,例如:

logging.basicConfig(
    level=logging.DEBUG,
    format='[%(levelname)s] (%(processName)s) %(message)s')

然后,在子进程中:

logging.debug('About to do XYZ')

输出:

[DEBUG] (mysuperservice_1) About to do XYZ