Вход в Python с помощью файла конфигурации - Использование обработчиков, определенных в файле, через код - PullRequest
11 голосов
/ 07 декабря 2010

Я использую модуль регистрации 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. Как добавить или удалить обработчики файлов или экранов из регистратора сетевых карт?

Ответы [ 3 ]

5 голосов
/ 07 декабря 2010

Вместо того, чтобы динамически изменять файл конфигурации, просто используйте 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)
1 голос
/ 07 декабря 2010

Из документации logging модуля похоже, что logging объекты имеют следующие два метода:

Logger. addHandler (hdlr)

  Adds the specified handler hdlr to this logger.

Logger. removeHandler (hdlr)

  Removes the specified handler hdlr from this logger.

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

0 голосов
/ 08 декабря 2010

Хорошо. Итак, я нашел изящный способ проникновения в суть гугл-группы в 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!!')

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

...