Python异常记录

时间:2014-04-24 07:31:43

标签: python logging

我目前通过...

记录程序的例外情况
def log_message(text):
    log_file = "/var/log/logfile.txt"

    try:
        if os.path.isfile(log_file):
            mode = "a"
        else:
            mode = "w"

        with open(log_file, mode) as myfile:
            myfile.write("%s\n" % (text))

        return True

    except Exception as e:
        print "error : ",e
        return False

try:
    ... some code

except Exception as e:
        log_message("error : %s" % (e))

然而,我的日志我得到" TypeError:类型' NoneType'是不可迭代的#34; 有没有办法从异常中记录其他信息,如下所示。如行号模块文件等?

>>> post_builder_ghost(abc).generate()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "post_builder.py", line 34, in generate
    if 'youtube' in self.video:
TypeError: argument of type 'NoneType' is not iterable
>>>

谢谢,

2 个答案:

答案 0 :(得分:1)

直接回答您的问题:查看traceback.print_exc

<强> BUT ...

您应该查看standard loggingtutorial)。您的代码将成为(以最简单的形式):

import logging
logging.basicConfig(stream=open("/var/log/logfile.txt", "a+"))

LOG = logging.getLogger(__name__)

try:
   ... some code
except Exception as e:
   LOG.exception("human readable explanation of what you did")

如前所述,这是最简单的日志记录形式。你可以比这更进一步!就个人而言,我会建议反对 basicConfig。但为了让你快速前进,它会做得很好。

深入了解日志配置,您将能够做更多有用的事情,例如在一个文件中编写调试信息,将错误消息写入另一个文件(或者像stderr,stdout这样的流)。

它还支持您提出的问题,例如记录模块名称,文件名和行号,但默认情况下禁用此功能。您可以通过指定自己的消息格式来启用它(有关字段的参考,请参阅LogRecord objects):

logging.basicConfig(stream=open("/var/log/logfile.txt", "a+"),
                    format="%(levelname)s:%(name)s:%(pathname)s:%(lineno)s:%(message)s")

我上面使用的LOG.exception方法将包括堆栈跟踪(这是你想要的)。您还有其他方法(.debug.info.warning.error.critical),这些方法只会发出消息。

根据经验,您希望在应用程序中尽快配置日志系统 ,但不要在模块级别执行此操作,以避免在可能的情况下干扰其他库。如果它是一个控制台应用程序,“入口点”将有助于(或用if __name__ == '__main__'块保护它。

配置完成后(手动或使用basicConfig),您可以将其放入每个模块中:

import logging
LOG = logging.getLogger(__name__)

这将为该模块提供一个记录器(LOG),并使您能够在以后(甚至在运行时)配置每个模块的日志记录(例如增加/减少详细程度)。

答案 1 :(得分:0)

您可以使用traceback.format_exc

import traceback

try:
    some code ...
except Exception:
    exp = traceback.format_exc()
    log_message("error : %s" % (exp))