Ведение параллельных процессов в Django - PullRequest
2 голосов
/ 03 апреля 2019

Я работаю над приложением на основе Django, которое должно записывать в файл журнала несколько процессов.

Я посмотрел на идею этого ответа , в которой подробно описан подход, использованный в пакете multiprocessing-logging . По сути, он создает очередь для обработки вывода в logfile, делая доступным пользовательский подкласс logging.Handler, MultiProcessingHandler. Функция install_mp_handler, которую я использую ниже, является частью этого пакета и просто «оборачивает» указанный логгер в этом классе.

Однако я не могу найти способ реализовать это в Django таким образом, чтобы избежать появления этой ошибки:

PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: /logfile.log -> /logfile.log.1

В моем файле MyApp/settings.py обработчик лог-файла настроен так:

'handlers': {
        ....
        'logfile': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': BASE_DIR + "/logfile.log",
            'maxBytes': 50000,
            'backupCount': 2,
            'formatter': 'standard',
        },
        'console': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'standard'
        },
    },
    'loggers': {
        'django': {
            'handlers': ['console'],
            'propagate': True,
            'level': 'WARN',
        },
        'django.db.backends': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        },
        'MyApp': {
            'handlers': ['console', 'logfile'],
            'level': 'DEBUG',
        },

В части приложения, которая запускает несколько процессов, у меня настроено ведение журнала следующим образом:

# Ref: https://github.com/jruere/multiprocessing-logging
import logging
from multiprocessing_logging import install_mp_handler
LOG = logging.getLogger('MyApp')
install_mp_handler()

...

if __name__ == '__main__':

...

with Pool() as pool:
    pool.map(func, iterable)

Примечания. Это нормально регистрирует консоль, но, похоже, не влияет на постановку в очередь вывода в файл журнала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...