2016-03-31 3 views
3

С библиотекой logging вы можете входить в файл. Вы должны установить уровень журнала обработчика файлов. Любой журнал с уровнем, равным или превышающим указанный уровень, записывается в файл.Регистрация: как установить максимальный уровень журнала для обработчика

Но что делать, если я хочу записывать ошибки и исключения в файл myapp_errors.log, информацию в другой файл myapp_info.log и любой другой журнал в другой файл myapp_debug.log? Единственный вариант - создать три регистратора?

ответ

3

Вы можете добавить фильтры к файловым манипуляторам. Таким образом вы можете перенаправить определенные уровни в разные файлы.

import logging 

class LevelFilter(logging.Filter): 
    def __init__(self, low, high): 
     self._low = low 
     self._high = high 
     logging.Filter.__init__(self) 
    def filter(self, record): 
     if self._low <= record.levelno <= self._high: 
      return True 
     return False 


logging.basicConfig(level=logging.DEBUG) 

log = logging.getLogger('foo') 
error_handler = logging.FileHandler('error.log', 'a') 
error_handler.addFilter(LevelFilter(40, 40)) 
warn_handler = logging.FileHandler('warn.log', 'a') 
warn_handler.addFilter(LevelFilter(30, 30)) 
log.addHandler(error_handler) 
log.addHandler(warn_handler) 

log.debug('debug') 
log.info('info') 
log.warn('warn') 
log.error('error') 

Предупреждения будут идти в warn.log, ошибки в error.log. Все остальные уровни не будут храниться в файле.

Пример:

$ python log.py 
DEBUG:foo:debug 
INFO:foo:info 
WARNING:foo:warn 
ERROR:foo:error 
$ tail -n +1 *.log 
==> error.log <== 
error 

==> warn.log <== 
warn 
+0

Я запускаю код. Оба файла имеют все журналы. –

+0

Вордс есть опечатка. Он не должен запускаться вообще. Можете ли вы попробовать еще раз? Это работает для меня – Schore

+0

Это странно, если я запустил его в ipython notebok, он не работает, но из командной строки он работает. –

1

Вы должны взглянуть на python documentation. Рекомендуется использовать несколько логгеров.

+2

logging.disable (лвл) может быть полезно разделить различные уровни – Schore

+0

Ну, например, вы сообщили добавляет еще один обработчик тот же регистратор, корневой регистратор. Другие регистраторы используются только для различной области сигнала. @Schore: 'logging.disable (lvl)' не отключает все журналы с уровнем, равным или ниже lvl? Мне нужно что-то, что отключается для более высоких уровней и для конкретного обработчика. –

Смежные вопросы