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

Python 在子进程日志记录中使用supervisord生成的进程名称,python,logging,supervisord,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=

我想在子进程日志记录中使用子进程的名称(如“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获得它。

在主代码中,您使用
%(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

在主代码中,使用
%(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

如果未使用
多处理
,则进程名称通常始终为
MainProcess
。要覆盖此项,可以向相应的处理程序添加筛选器,其工作方式如下:

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

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

如果您没有使用
多处理
,则进程名称通常将始终是
MainProcess
。要覆盖此项,可以向相应的处理程序添加筛选器,其工作方式如下:

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

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

您错了。使用您的方法,我将获得“MainProcess”作为进程名称。例如,使用psutil模块(并通过pid获取进程名),我将得到简单的“python”。这就是所有服务的原因,
python myservice.py…
。这是我工作代码的一部分。我正在使用
多处理
模块。psutil甚至没有在原始帖子中提及。海武,我已经更新了原始帖子。Thx for notice=)你错了。使用您的方法,我将获得“MainProcess”作为进程名称。例如,使用psutil模块(并通过pid获取进程名),我将得到简单的“python”。这就是所有服务的原因,
python myservice.py…
。这是我工作代码的一部分。我正在使用
多处理
模块。psutil甚至没有在原始帖子中提及。海武,我已经更新了原始帖子。通知的Thx=)Thx
os.environ['SUPERVISOR\u PROCESS\u NAME']
正是我需要的!我错过了督导员docsthx的报告
os.environ['SUPERVISOR\u PROCESS\u NAME']
正是我需要的!我从医生那里漏掉了这个