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

0 投票
2 回答
2497 浏览
提问于 2025-04-18 09:42

我想在子进程的日志中使用子进程的名称(比如“mysuperservice_1”、“mysuperservice_2”等等)。这些服务是用Python写的。

我该怎么做呢?谢谢!=)

编辑1

我的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 个回答

2

在主代码中,你可以用 %(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
6

如果你没有使用 multiprocessing 这个模块,那么你的进程名称通常会一直是 MainProcess。如果你想改变这个名称,可以给合适的处理器添加一个过滤器,方法大致如下:

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

然后像 Hai Vu 提到的那样,在格式字符串中使用 %(processName)

撰写回答