我目前通过...
记录程序的例外情况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
>>>
谢谢,
答案 0 :(得分:1)
直接回答您的问题:查看traceback.print_exc
<强> BUT ... 强>
您应该查看standard logging(tutorial)。您的代码将成为(以最简单的形式):
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))