2015-02-03 2 views
-1

Я хотел зарегистрировать сообщения из другого модуля в python в файл. Также мне нужно распечатать некоторые сообщения для консоли для целей отладки. Для этой цели я использовал модуль журнала. Но модуль logger будет записывать все журналы с заданной строгостью и выше в файл или консоль.Как обмениваться файлами между модулями для входа в python

Я хотел только сообщения, записанные в файл, и он не должен включать сообщения с консоли.

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

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

Есть ли более простой подход, чем это в python?

EDIT: Я новичок в Python. Пример программы я попытался

logger = logging.getLogger('simple_example') 
logger.setLevel(logging.INFO) 
# create file handler which logs even debug messages 
fh = logging.FileHandler('spam.log') 
fh.setLevel(logging.CRITICAL) 
# create console handler with a higher log level 
ch = logging.StreamHandler() 
ch.setLevel(logging.ERROR) 
# create formatter and add it to the handlers 
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') 
ch.setFormatter(formatter) 
fh.setFormatter(formatter) 
# add the handlers to logger 
logger.addHandler(ch) 
logger.addHandler(fh) 

# 'application' code 
logger.debug('debug message') 
logger.info('info message') 
logger.warn('warn message') 
logger.error('error message') 
logger.critical('critical message') 

консоли принты:

2015-02-03 15:36:00,651 - simple_example - ERROR - error message 
2015-02-03 15:36:00,651 - simple_example - CRITICAL - critical message 
#I don't want critical messages in console. 
+0

ваши пытавшихся 'logging' обработчики? –

+0

Да, я пробовал. Но я не знаю, как это решит проблему. – Knight71

+0

, по каким критериям вы хотите отделить вывод вывода вывода и вывода файла? –

ответ

1

Вот сценарий, который создает два регистратора, используя тот, который вы хотите записать в файл или стандартный вывод. Вопрос заключается в следующем: по каким критериям вы выбираете log to stdout или файл, зная, что (из вашего вопроса) вы не хотите, чтобы критерием был уровень журнала (debug, error, critical ...)

#!/usr/bin/python 

import logging 

logger_stdout = logging.getLogger('logger_stdout') 
logger_stdout.setLevel(logging.DEBUG) 
sh = logging.StreamHandler() 
sh.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')) 
logger_stdout.addHandler(sh) 
logger_stdout.debug('stdout debug message') 

logger_file = logging.getLogger('logger_file') 
logger_file.setLevel(logging.DEBUG) 
fh = logging.FileHandler("foo.log") 
fh.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')) 
logger_file.addHandler(fh) 
logger_file.debug('file debug message') 

И когда я запускаю этот скрипт:

D:\jrx\jrxpython               
λ python essai.py               
2015-02-03 11:12:07,210 - logger_stdout - DEBUG - stdout debug message  

D:\jrx\jrxpython               
λ cat foo.log                
2015-02-03 11:12:07,224 - logger_file - DEBUG - file debug message   

D:\jrx\jrxpython               
λ 
0

CRITICAL is higher than ERROR:

Вы также можете проверить себя:

>>> import logging 
>>> print logging.CRITICAL 
50 
>>> print logging.ERROR 
40 
>>> 

Есть два случая, в протоколирования:

Регистрация в том же процессе - у вас должно быть несколько обработчиков с разными уровнями ведения журнала в зависимости от того, насколько подробными должны быть журналы. A более высокий уровень означает нет мощность. Вот почему DEBUG - это самый низкий предопределенный уровень журнала - он записывает все для целей отладки.

Logging различных процессов - вы должны иметь несколько регистраторов набора, они могут быть доступны из любого места в коде, используя logging.getLogger(name). Это дает тот же регистратор каждый раз, так что установка регистратора сохраняется через код и только должна быть выполнена раз.

Первый случай показывает, что у вас не может быть журнал ошибок «ошибка, но не критический», поскольку это противоречит тому, как журналы должны работать. У вас может быть журнал «критический, но не ошибочный», то есть менее подробный. Это то, что вы, вероятно, захотите.

+0

изменение уровня приведет к тому, что файл журнала будет включать как ошибки, так и критические журналы. – Knight71

+0

Чтение вопроса, похоже, вы пытаетесь войти в разные ** уровни **, а не ** сообщения **. Это особенно отражается в последнем бите, где вы показываете то, что считаете ошибочным ('CRITICAL' регистрируется). –

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