Динамический путь к файлу и имя файла для FileHandler в файле конфигурации logger в python - PullRequest
13 голосов
/ 23 февраля 2012

У меня есть файл конфигурации журнала Python с обработчиком файлов приведенной ниже формы.

[handler_filelog]
class: FileHandler
args = ('/var/tmp/log/client.log','a')

Вместо этого мне нужно это в форме ниже (динамически сгенерированный путь).

[handler_filelog]
class: FileHandler
args = ('/var/tmp/log_<unique_string>/client.log','a')

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

Есть ли способ справиться с этим, используя подход файла конфигурации? Я не заинтересован в том, чтобы самостоятельно создавать регистраторы / обработчики / форматеры, поскольку в моем конфигурационном файле журнала их много, а подход на основе конфигурационных файлов гораздо приятнее.

(Обновление: я использую python 2.4)

Ответы [ 3 ]

11 голосов
/ 23 февраля 2012

Это делает то, что вам нужно. Сначала вы должны расширить класс FileHandler. Поместите это в файл, скажем, myHandler.py в каталоге вашего конфигурационного файла:

import logging
import random
import os
class myFileHandler(logging.FileHandler):
    def __init__(self,path,fileName,mode):
        r = random.randint(1,100000)
        path = path+"/log_"+str(r)
        os.mkdir(path)
        super(myFileHandler,self).__init__(path+"/"+fileName,mode)

И затем в конфигурационном файле вы можете использовать этот пользовательский FileHandler, как этот

class: myHandler.myFileHandler
args = ('/var/tmp','client.log','a')

Я проверил это на своей машине

6 голосов
/ 24 февраля 2012

Если вы используете Python 2.7 или 3.2, вы можете использовать словарную конфигурацию , которая позволяет указывать произвольные вызовы для возвращаемых обработчиков - вы можете, например, использовать PID процесса для создания имени файла.

Обновление: Если вы используете 2.4, вы можете использовать пакет logutils , который должен работать с Python 2.4 (кроме класса LoggerAdapter, который требует 2.5или позже).Пакет logutils содержит функциональные возможности конфигурации на основе словаря.

0 голосов
/ 18 января 2018

«CallbackFilter» может использоваться для реализации динамического пути к файлу и имени файла в файле конфигурации регистратора в python.Вы можете определить write_dynamic_log следующим образом:

def write_dynamic_log(record):
    now = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
    dynamic_log_name = '/var/log/test_%s.log' %now
    log_file = open(dynamic_log_name, "w")
    log_file.write(record.msg)
    log_file.close();
    return True

Затем в файле конфигурации вы можете использовать этот фильтр следующим образом:

[handler_filelog]
class: FileHandler
formatter: brief
level   : INFO
filters: [write_dynamic_log]
filename: static.log

Журнал INFO или выше будет выводиться в статический.log, а также в dynamic_log.

Я проверил это в своем проекте django, в котором я написал config в моем settings.py.Работает нормально.Регистрация будет как:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '[%(levelname)s] %(asctime)s - %(pathname)s:%(lineno)d\n%(message)s'
        },
        'debug': {
            'format': '[%(levelname)s] %(asctime)s - %(pathname)s:%(lineno)d\n\033[34m%(message)s\033[0m'
        },
        'error': {
            'format': 'Component: %(module)s\nErrorCode: %(funcName)s\nReason: %(funcName)s\nDetail: [%(message)s]'
        },
    },
    'filters': {
        'write_error_logs': {
            '()': 'django.utils.log.CallbackFilter',
            'callback': write_error_log,
        }
    },
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'formatter': 'verbose',
        },
        'debug': {
            'class': 'logging.StreamHandler',
            'formatter': 'debug',
        },
        'error': {
            'level': 'ERROR',
            'class': 'logging.FileHandler',
            'filename': '/var/log/SmartStorageApp.err',
            'formatter': 'error',
            'filters': ['write_error_logs'],
        },
    },
    'loggers': {
        'django': {
            'handlers': ['debug' if DEBUG else 'console', 'error'],
            'level': 'INFO',
            'propagate': True,
        },
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...