2012-02-25 137 views
2

下面的脚本将所有错误写入日志文件和控制台,除了仅在控制台上写入并且不在日志中的引发异常外。如何让它写出引发的异常记录或任何运行时异常?谢谢。Python:向控制台和日志文件显示并记录运行时错误

import os 
import sys 
import logging 
import logging.config 

class Main(object): 

    @staticmethod 
    def main(): 
    logging.config.fileConfig("logging.conf") 
    logging.debug("1") 
    logging.info("2") 
    logging.warn("3") 
    logging.error("4") 
    logging.critical("5") 
    raise Exception("test") 

if __name__ == "__main__": 
    Main.main() 


import logging 
import logging.config 

logging.config.fileConfig('logging.conf') 

# create logger 
logger = logging.getLogger('simpleExample') 

# 'application' code 
logger.debug('debug message') 
logger.info('info message') 
logger.warn('warn message') 
logger.error('error message') 
logger.critical('critical message') 
raise Exception("Exception raised") 

配置文件:

[loggers] 
keys=root,simpleExample 

[handlers] 
keys=consoleHandler 

[formatters] 
keys=simpleFormatter 

[logger_root] 
level=DEBUG 
handlers=consoleHandler 

[logger_simpleExample] 
level=DEBUG 
handlers=consoleHandler 
qualname=simpleExample 
propagate=0 

[handler_fileHandler] 
formatter=simpleFormatter 
args=('error.log') 

[handler_consoleHandler] 
class=StreamHandler 
level=DEBUG 
formatter=simpleFormatter 
args=(sys.stdout,) 

[formatter_simpleFormatter] 
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s 
datefmt= 
+0

您是否正在使用FileHandler将日志输出到日志文件? – Phani 2012-02-25 05:16:17

+0

对不起,我只是添加了文件处理程序,但同样的问题。 – Bass 2012-02-25 05:36:53

+0

无法记录运行时错误。你需要先回答他们,如答案中所述。 – Phani 2012-02-25 05:39:10

回答

7

为了让使用logging模块捕获的所有错误,第一个要求是给你用,除了声明赶上他们。一旦你捕捉到它们,你就必须根据错误的级别调用Logger.exception()或其他合适的函数。

如果您不能预先捕获所有异常,最好的办法是将stdoutstderr重定向到一个文件。然后,执行tail -f模拟控制台输出。无论如何,一个未捕获的异常将导致程序执行被停止。

但是,我宁愿试图捕捉所有异常,即使这意味着必须做这样的事情。

try: 
    Main.main() 
except Exception as e: 
    logging.Exception("Unexpected exception! %s",e) 

这使您可以使用,而不必依赖于蹩脚的输出重定向整齐logging模块。

+0

感谢您的快速反馈。目标是使用更灵活的日志记录模块。我试图避免使用尝试/除了整个主,因为我想有更多的控制处理异常。有没有办法通过配置文件管理运行时错误日志和控制台? – Bass 2012-02-25 05:45:13

+0

无论如何,任何运行时错误都会导致整个程序停止运行。所以,除非你发现这个例外,否则没有什么可做的。但是,如果你使用'Logger.exception()',你也会得到回溯,所以它和获得运行时错误一样好。这可以在main()上完成。你仍然能够追踪错误,因为追溯 – Phani 2012-02-25 05:51:00

+0

问题在这里,我想抛出一些异常并从其他人身上恢复。所以在main中使用全局异常可能不是一个好主意。另外,主要方法在其他文件中调用许多其他函数,所以try/except可能不会覆盖它们。我想记录运行时异常的原因是因为我的应用程序作为Web服务运行,所以如果用户发出请求并且由于生产者运行时错误而没有得到响应,那么我可以轻松排除故障。 – Bass 2012-02-25 06:48:52

相关问题