我正在使用一个大型python模块(Python 2.6.6)并在数千个地方进行日志记录,并且我正在使用python的logger模块。 现在,我想忽略在日志记录期间生成的异常。 可能的基本方案之一是
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 logger上创建包装类并使用try-except作为记录器函数的方法之一。 但我有不同的要求,我不想这样使用,有没有其他方法来做这个或python logger的任何属性,这对我的情况有用?
答案 0 :(得分:9)
您无需忽略异常,因为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)
您使用的内容可归结为是否在LOG_FILENAME
中提供错误的路径是否是应用程序错误。
答案 1 :(得分:1)
因此,在您编辑后,这不是真的有效。
您可以使用try
- except
方法
示例:
try:
file_handler =open("not_a_file_for_sure","r")
except IOError:
print "File not found"
您可以except
出现任何类型的错误,甚至是所有错误,但不建议这样做。
如果你不关心它,只需except
你得到的错误和continue
或pass
。