Django запись в несколько файлов одновременно даже с помощью RotatingFileHandler? - PullRequest
1 голос
/ 28 мая 2020

Я использую Django с конфигурацией ведения журнала следующим образом:

LOGGING = {
    'version':1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '{asctime} {process:d} {thread:d} {levelname} {name} {module} {funcName} {message}',
            'style': '{',
        }
    },
    'handlers': {
        'file': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': BASE_DIR+'/logs/django_logs.log',
            'backupCount': 14,
            'maxBytes': 52428800,
            'formatter': 'verbose'
        }
    },
    'loggers': {
        '': {
            'handlers': ['file'],
            'level': 'INFO'
        }
    },
}

Я запускаю 16 процессов django, несколько daphne для веб-сокетов и несколько процессов gunicorn для обычных вызовов API на основе django остальные рамки. Но когда я смотрю журналы, сразу регистрируется несколько файлов. Например, django_logs.1 .... django .logs.14 одновременно входят в систему. Нужно ли мне добавлять что-то еще, чтобы вести журнал сразу в один файл и вращать его только тогда, когда его размер превышает указанный размер файла журнала?

Для дополнительной информации я использую python 3.6.8 и я инициализировать регистратор в каждом файле проекта следующим образом:

import logging
logger = logging.getLogger(__name__)

1 Ответ

2 голосов
/ 02 июня 2020

Из docs. python .logging-cookbook :

Хотя ведение журнала является потокобезопасным, а ведение журнала в один файл из нескольких потоков в одном процессе поддерживается, ведение журнала в один файл из нескольких процессов не поддерживается , потому что в Python нет стандартного способа сериализации доступа к одному файлу для нескольких процессов. Если вам нужно войти в один файл из нескольких процессов, один из способов сделать это - записать все процессы в SocketHandler и иметь отдельный процесс, реализующий сервер сокетов, который читает из сокет и журналы в файл. (При желании вы можете выделить один поток в одном из существующих процессов для выполнения этой функции.)

Полный пример этого подхода также подробно описан в книге рецептов. См. Этот раздел. .

В документации также предлагается несколько альтернатив этому подходу:

В качестве альтернативы вы можете использовать Queue и QueueHandler для отправки всех событий регистрации в один из процессов в многопроцессорном приложении

Я проверил вашу конфигурацию ведения журнала, и она работает должным образом, когда уникальный процесс регистрируется в обработчик файлов. Файл должен вращаться только при достижении maxBytes

...