Подтвердить что ты не робот

Вход в Python с файлом Config - использование обработчиков, определенных в файле через код

Я использую logging-модуль python. Как я могу получить доступ к обработчикам, определенным в файле конфигурации, из кода. В качестве примера у меня установлен логгер и два обработчика - один для экрана и другой для файла. Я хочу использовать соответствующий обработчик на основе предпочтений пользователей (нужно ли они регистрироваться на экране или в файле). Как я могу динамически добавлять и удалять обработчики, определенные в файле конфигурации, из журналов, определенных в файле конфигурации?

[loggers]

keys=root,netmap

[handlers]
keys=fil,screen

[logger_root]
level=NOTSET
handlers=

[logger_netmap]
level=INFO
handlers=fil,screen
qualname=netmap

[formatters]
keys = simple

[formatter_simple]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=

[handler_fil]
class=handlers.RotatingFileHandler
args=('file.log','a','maxBytes=10000','backupCount=5')
formatter=simple

[handler_screen]
class=StreamHandler
args = (sys.stdout,)
formatter=simple

В зависимости от того, запускается ли программа программой с -v или нет, мне нужно использовать один из File или Screen Handler. Как я могу добавить или удалить обработчики файлов или экранов из регистратора сетевых карт?

4b9b3361

Ответ 1

Вместо того, чтобы динамически изменять конфигурационный файл, просто используйте Logger.addHandler(обработчик).

fileHandler = logging.handlers.RotatingFileHandler('file.log', mode='a', maxBytes=10000, backupCount=5)
logger = logging.getLogger('netmap')

if LOG_TO_FILE:
    logger.addHandler(fileHandler)

Затем для загрузки в форматирование, возможно, из одного файла;

import ConfigParser
configParser = ConfigParser.ConfigParser()
config.read('config.ini')

format = config.get('formatter_simple', 'format')
fileHandler.setFormatter(format)

Ответ 2

Из logging модуля документации он выглядит как logging объекты имеют эти два метода:

Logger. AddHandler (hdlr)

  Adds the specified handler hdlr to this logger.

Логгер. removeHandler (hdlr)

  Removes the specified handler hdlr from this logger.

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

Ответ 3

Хорошо Итак, я нашел элегантный способ через gud soul в группе google python. Он работает как шарм. Здесь код

import logging
import getopt
import sys
import logging.config

def stop(m,handl):
    consoleHand=[h for h in m.handlers if h.__class__ is handl]
    print consoleHand
    if consoleHand:
        h1=consoleHand[0]
        h1.filter=lambda x: False


logging.config.fileConfig('log.conf')
my_log = logging.getLogger('netmap')
args=sys.argv[1:]
opt,arg = getopt.gnu_getopt(args,'v')
l=''
for o,a in opt:
    if o=='-v':
        l='verbose'
        stop(my_log,logging.handlers.RotatingFileHandler)
if not l:
    stop(my_log,logging.StreamHandler)
my_log.debug('Starting.....')
my_log.warning('Unstable')
my_log.error('FIles Missing')
my_log.critical('BlowOut!!')

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