2016-02-02 3 views
2

Я работаю в большом модуле python (Python 2.6.6) и выполняя вход в тысячи мест, и я использую модуль logger python. Теперь я хочу игнорировать исключение, которое создается во время ведения журнала. Один из основного сценария, который может быть возможным являетсяКак игнорировать исключение, которое генерируется при регистрации в python?

import glob 
import logging 
import logging.handlers 

LOG_FILENAME = '/home/abc/logging_rotatingfile_example.out' 
my_logger = logging.getLogger('MyLogger') 
my_logger.setLevel(logging.DEBUG) 

# Add the log message handler to the logger 
handler = logging.handlers.RotatingFileHandler(
       LOG_FILENAME, maxBytes=20, backupCount=5) 
my_logger.addHandler(handler) 
# Log some messages 
for i in range(20): 
    my_logger.debug('i = %d' % i) 

Теперь предположим, что во время my_logger.debug('i = %d' % i) некоторые, как файл будет удален из системы или разрешения изменены и регистратор не мог в состоянии войти из-за сбоя диска, диск полный и т. д. в файле журнала и генерировать исключение на экране. Распределенная система и n число процессов используют модуль регистрации. Обратите внимание, что процесс не должен прерываться из-за исключения регистрации (из-за сбоя диска, полного диска и т. Д.). Так что я хочу, чтобы это исключение игнорировалось.

ПРИМЕЧАНИЕ: Теперь один из способов, которым я знаю, чтобы сделать класс обертки на регистраторе python и использовать try-except, кроме функции logger. Но у меня разные требования, и я не хочу использовать этот способ, так что есть ли другой способ сделать это или любой атрибут журнала python, который может быть полезен для моего состояния?

+1

Почему нет 'try'-'except'? – Falko

+0

Вы можете попробовать выполнить ведение журналов с помощью собственного класса, но вам нужно будет использовать try-except, чтобы игнорировать исключения. – eli

ответ

7

Вам не нужно игнорировать исключения, потому что модуль loggingуже обрабатывает их для вас.

Все операции с файлами (извещание, поворот и т. Д.) Охраняются с помощью блоков try..except Exception. Если происходят исключения, то logging.Handler.handeError() method вместо этого напишет исключение на sys.stderr. Вы можете установить logging.raiseExceptions в False, чтобы заставить замолчать эти:

import logging 

logging.raiseExceptions = False 

Цитируя документации:

Этот метод должен быть вызван из обработчиков, когда исключение встречается во время emit() вызова. Если атрибут уровня модуля raiseExceptions равен False, исключения становятся молча игнорируемыми. Это то, что в основном требуется для системы ведения журнала - большинство пользователей не заботятся об ошибках в системе ведения журнала, их больше интересуют ошибки приложений. Однако вы можете заменить это специальным обработчиком, если хотите. Указанная запись является той, которая обрабатывалась при возникновении исключения. (Значение по умолчанию raiseExceptions равно True, поскольку это более полезно при разработке).

Если имя файла, переданное в RotatingFileHandler не может быть создан, то исключения, сгенерированные не происходит при рубке, однако, это происходит при создании обработчика. Вы должны либо обработать это исключение там и тогда, или установить delay=True при создании обработчика для отложит открытие файла до времени регистрации:

handler = logging.handlers.RotatingFileHandler(
    LOG_FILENAME, maxBytes=20, backupCount=5, delay=True) 

Что вы используете сводится к Wether или вы не видите предоставления некорректного путь в LOG_FILENAME - ошибка приложения или нет.

+0

Пожалуйста, ознакомьтесь с обновленным вопросом, я также пробовал свой путь, но результат все тот же. –

+1

@ShanuPandit: это исключение создается при настройке обработчика, а не во время ведения журнала. Поймайте это исключение и вместо этого используйте другой обработчик. –

+1

@ShanuPandit: альтернативно, установите 'delay' в true, чтобы не открывать файл * немедленно *. –

1

Итак, после вашего редактирования это действительно не так.

Вы можете использовать try - метод except

Пример:

try: 
    file_handler =open("not_a_file_for_sure","r") 
except IOError: 
    print "File not found" 

Вы можете except любые ошибки, или даже все из них, но это не рекомендуется.

Только except ошибка, которую вы получаете, и continue или pass это, если вам это не интересно.

+1

Это малопригодно для ошибок ввода-вывода * во время ведения журнала *, поскольку они не вызывают исключения. Вместо этого модуль 'logging' обрабатывает их. –

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