V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Muninn
V2EX  ›  Python

Python 怎么把没捕获的异常打印到日志里

  •  
  •   Muninn ·
    hyacinthus · 2013-10-12 17:51:55 +08:00 · 9973 次点击
    这是一个创建于 4051 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我完全是新手,之前都是用python写写小脚本,没有考虑过这种问题.

    现在做一个项目,我知道在捕获异常后可以logging.exception打出来.

    但是假如一个没有预料到的异常出现了.
    然后在日志里没有记录.
    我从何查起啊? 去哪找这异常.
    能把所有的异常都直接输出到logging模块吗?

    这又涉及到另一个问题.
    主流观点到底推荐不推荐尽我所能的去捕获异常.
    我感觉程序崩溃了直接根据异常查错误就完了,捕获了再退出岂不是多此一举?
    7 条回复    1970-01-01 08:00:00 +08:00
    Livid
        1
    Livid  
    MOD
       2013-10-12 18:06:25 +08:00 via iPhone   ❤️ 2
    binux
        2
    binux  
       2013-10-12 18:09:34 +08:00
    捕获你能处理的异常,其他时候请让程序挂掉

    定义:能处理的异常
    当异常发生时,你知道应该如何恢复/继续执行
    hepochen
        3
    hepochen  
       2013-10-12 20:55:49 +08:00   ❤️ 1
    建议使用@Livid 推荐的sentry,它源码是开放的,自己的github上下过来搭一个,会方便很多。

    另外,不推荐“尽你所能去捕获异常”,异常的捕获可以作为基础逻辑进行判断,这确实是Python的一个特性;但是捕获所有的异常,这不现实。

    如果所有异常需要输出,比较快的方法是写个函数(来处理/打印异常信息),最后将函数赋值给sys.excepthook上就可以了。

    “我感觉程序崩溃了直接根据异常查错误就完了,捕获了再退出岂不是多此一举?” --> 关于这个问题,你自己再想想?
    Muninn
        4
    Muninn  
    OP
       2013-10-12 22:11:58 +08:00
    @Livid 谢谢 我研究研究

    @binux 我是用这个思路的 但是我的问题是 daemon程序挂掉以后我想看到记录,现在我不知道它怎么挂掉的。

    @hepochen 你也说了,不推荐尽可能的捕获异常。我一直是异常没必要导致程序崩溃我会捕获,其他的不捕获。这在主动执行的脚本没问题,异常了在屏幕上可以看到,但是python的logging模块不能打印出来没捕获的这些异常。 我写的是后台程序,不会往screen上输出东西,程序崩溃了以后异常信息就不见了。。。 所以我觉得logging非要捕获了再输出多此一举,官方文档虽然用一节解释了这个事情,我依然觉得应该有选项可以往日志输出异常我每找到。。。后来想明白,程序崩溃了logging应该已经无法工作了,这是逻辑问题,应该必须用第三方的观察者解决。
    sethverlo
        5
    sethverlo  
       2013-10-12 22:15:20 +08:00
    突然想到知乎有个问题叫「Fenng 都推荐过哪些靠谱的东西」……

    感觉 Livid 手里的好玩儿的肯定更多……
    hepochen
        6
    hepochen  
       2013-10-13 01:57:05 +08:00   ❤️ 1
    @Muninn 你没有明白我的意思。

    1, 如果是整个程序挂掉了,logging最后是默认在工作的,也就是一般情况下,你自己运行一个py文件,然后报错的输出。这个原理跟重写一个sys.excepthook是一样的。

    2,如果是以daemon运行,那么你需要的是让err logging最终保留到一个日志中。也就是你要把stderr从屏幕打印转为文件保存。建议试试supervisor,里面有redirect_stderr与stdout_logfile可以进行配置。

    3,如果只是想极简单的处理这个问题,自己写个函数,处理错误的信息(即保存到某个文本中),赋值给sys.excepthook就可以了。


    - - - -

    “我感觉程序崩溃了直接根据异常查错误就完了,捕获了再退出岂不是多此一举?”

    触发的错误,即使是同一种错误,但是触发点(运行时的错误点)在不同文件中,那么收集到的错误信息也是不一样的,包括所在代码行,当前运行的上下文环境等。你可能会遇到很多基本就无法重现的问题,(多数是Web环境,或者其它非独自使用的程序)。呃,因为,我感觉可能是自己水平所限,无法解释清楚了。所以,我说,你再想想?
    Muninn
        7
    Muninn  
    OP
       2013-10-15 14:55:13 +08:00
    @hepochen 感谢写了这么多 V2EX的新消息提示我总感觉有问题,经常不提示我.

    其实我提出这问题就是有点强迫症而已. 我已经有一个日志文件了,现在出了异常却要把STDERR定向到另一个日志文件里. 写到同一个文件里吧,感觉又有点不好...哎 纠结

    可能我写的程序类型比较单一,都是后台脚本或者进程,现在也在学着写web,到时就能和你们聊到一起了:)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3667 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 04:20 · PVG 12:20 · LAX 20:20 · JFK 23:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.