熬着熬着,让时间熬成想要的那个自己,一个美丽的人。
分类: Python/Ruby
2014-02-12 14:29:47
Twisted有自己的logging系统,我们已经通过twistd看到了底层。这个系统不仅可以跟Twisted特定的概念,比如说Failures融合,也能很好的兼容python的标准库logging库。
基础的内置应用Logging
给你的Twisted的应用增加logging的最简单的方法就是引入import twisted.python.log,开始记录到一个文件或是输出。如果你想要,通过Python标准的logging模块也可以记录特定log级别的事件。比如说,Example 7-1增加了一个logging把我们第2章的echo server记录到一个文件中。
log.startLogging一旦被调用就会开始记录。之后信息被log.msg或者log.err来记录下来。Log.msg是用来记录字符串,log.err是记录异常或错误。默认的logging的格式似乎输出像这个echo server的启动监听一条信息后关闭。
想要输出log,用sys.stdout调用startLogging,如Example 7-2.
除非当你触发log.msg或者log.err记录信息,通常默认的情况是logging库会记录输出,(比如打印出statements),也会跟踪未被抓取的异常,也会监听记录Twisted模块提交的事件。这就是为什么我们在之前的记录里面看到各种EchoFactory事件。
Twisted有很多方便的类可供于定制你自己的log文件管理。其中一个类就是twisted.python.logfile.LogFile,可以人工调用或者需要一个特定的记录类型。Example7-3展示了两个特性。
随着log_rotation.py的运行,信息被记录在了/tmp/test.log下。如果log被人工分开或者rotateLegenth到达上限,现存的log数量就会增加(比如/tmp/test.log.1变成/tmp/test.log.2,/tmp/test.log变成了/tmp/test.log.1),最后第一个信息会放在数最大的log里面,/tmp/test.log.2,最后一个信息是放到/tmp/test.log里面。
因为按日期来划分log是更为常见的方式,Twisted也提供了DailyLogFile类来按日期的每天自动分成一个log文件。
Twistd Logging
如第6章节我们看到的,Twisted应用可以用twistd命令来运行Twisted的默认logging,输出到twistd.log里,如果daemonized或者没有输出。
Twistd的内置logging可以通过命令行参数来设置:设定一个log文件--logfile(用-来stdout),传递--syslog给log来记录到syslog而不是一个log文件中。
更进一步的设置,比如更改log的格式(默认是时间戳,比如2012-08-20 22:08:34-040),我们会需要改写自己的LogObserver。
自定义Loggers
举一个例子,假如我们需要一个Logger来记录输出并把错误信息用红色标识如何做呢?Example 7-4演示了如何用子类FileLogObserver来重写emit方法实现。
我们要用我们所定制的logger,唯一的事情就是用log.addObserver注册一个ColorizedLogObserver的实例。
我们也可以用ColorizedLogObserver作为一个定制logger给twistd应用,通过一个log observer工厂(比如就是实例LogObserver的emit方法),通过--logger命令参数来传递。例如,为了运行第6章我们的echo_server.tac的彩色logging输出,我们可以用如下命令行:
Twistd -ny echo_server.tac --logger=log_colorizer.logger --logfile=-
末尾的连字号--logfile=-是定义logging输出 -n是表示没有daemonize。
Logging的关键点和注意事项
Twisted的logging需要注意以下几点:
l 用log.startLogging把log记录到文件里,直接保存或者用简单的类比如DailyLogFile
l 事件由log.err和log.msg来记录,默认情况下,log.startlogging会重定向输出stdout和stderr到log中
l 用log.addObserver注册自定义logger
l 当你自己编写自定义log observer时,不要阻塞,不然你整个事件循环就会阻塞。Observer必须在线程安全范围内,如果用于多线程的程序中
l 用twistd运行的应用程序已经自动能记录log。Logging可以通过--logfile,--syslog,--logger来定制。