Различные уровни ведения журнала для обработчика файлов и отображения в Python - PullRequest
15 голосов
/ 11 июля 2011

Я использую модуль logging в Python для написания сообщений об ошибках и ошибках.

Я хочу записать в файл все сообщения logging.DEBUG или выше.

Однако я хочу печатать только на экране сообщения logging.WARNING или выше.

Возможно ли это, используя только один Logger и один FileHandler?

Ответы [ 3 ]

12 голосов
/ 19 июля 2011

Как уже упоминалось, обработчики настолько просты в создании и добавлении, что вам, вероятно, лучше использовать два обработчика.Однако, если по какой-то причине вы хотите придерживаться одной из них, в поваренной книге регистрации Python есть раздел, описывающий более или менее то, что вы хотите сделать: вход в консоль и в файл, но на разных уровнях (этодаже показывает, как сделать различное форматирование).Он делает это с одним StreamHandler, а не FileHandler, хотя:

import logging

# set up logging to file - see previous section for more details
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                    datefmt='%m-%d %H:%M',
                    filename='/temp/myapp.log',
                    filemode='w')
# define a Handler which writes INFO messages or higher to the sys.stderr
console = logging.StreamHandler()
console.setLevel(logging.INFO)
# set a format which is simpler for console use
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
# tell the handler to use this format
console.setFormatter(formatter)
# add the handler to the root logger
logging.getLogger('').addHandler(console)

# Now, we can log to the root logger, or any other logger. First the root...
logging.info('Jackdaws love my big sphinx of quartz.')

# Now, define a couple of other loggers which might represent areas in your
# application:

logger1 = logging.getLogger('myapp.area1')
logger2 = logging.getLogger('myapp.area2')

logger1.debug('Quick zephyrs blow, vexing daft Jim.')
logger1.info('How quickly daft jumping zebras vex.')
logger2.warning('Jail zesty vixen who grabbed pay from quack.')
logger2.error('The five boxing wizards jump quickly.')

Редактировать: Как обсуждалось в комментариях, этот код по-прежнему генерирует два обработчика, но "скрывает""одна конструкция с использованием basicConfig ().Я настоятельно рекомендую вам создать оба явно.

2 голосов
/ 11 июля 2011

Нет. Вывод файла и экрана означает, что вам нужно два обработчика.

0 голосов
/ 19 ноября 2018

Вы можете использовать тот же обработчик. В этом примере записываются сообщения в файл с помощью log.debug () и log.info () на консоль:

log = logging.getLogger("syslog2elastic")
log.setLevel(logging.DEBUG) # this must be DEBUG to allow debug messages through

console = logging.StreamHandler()
console.setLevel(logging.INFO)
formatter = logging.Formatter("%(asctime)s.%(msecs)03d - %(name)s:%(lineno)d - %(levelname)s - %(message)s", "%Y%m%d%H%M%S")
console.setFormatter(formatter)
log.addHandler(console)

fh = RotatingFileHandler(args.logfile, maxBytes=104857600, backupCount=5)
fh.setLevel(logging.DEBUG)
formatter = logging.Formatter("%(asctime)s.%(msecs)03d - %(message)s", "%Y%m%d%H%M%S")
fh.setFormatter(formatter)
log.addHandler(fh)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...