Я работаю над приложением на основе 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)
Примечания. Это нормально регистрирует консоль, но, похоже, не влияет на постановку в очередь вывода в файл журнала.