转到正文

存档

分类: Python

logging模块是Python的日志管理模块,它为Python的高效开发提供了强力的支持。

但是我在使用logging模块时却遇到一个很诡异的错误,我分别以"a"和"a.b"两个字符串调用logging.getLogger函数来获取两个logging对象。例如:

a= logging.getLogger("a")
b= logging.getLogger("a.b")

在执行上面两行代码后,(假设两个日志文件存放在同一文件目录下),对象a的日志输出是正常的,但是对象b出了些问题:每当对象开始进行打日志时,对象a也会被打日志。

出现这个问题,有两个解决方法:

  1. 将对象a所对应的日志文件放在与对象b所对应的日志文件不相同的目录下。
  2. 对象a所对应的日志文件与对象b所对应的日志文件放在相同的目录下,但是调用getLogger时,两个对象不能使用具有相同前缀名的名称。例如,我们可以分别以"a"和"a_b.b"来分别作为两个对象的 getlogger参数,因为它们的前缀分别是"a"和"a_b",二者不相同。

为什么这么来解决,可以看logging模块的源码。

在Linux环境下,默认情况下的python2.3的encode功能不能使用(不能encode gbk2312, utf8)。我们在项目中使用Twisted框架来开发CS结构的程序,服务器端和客户端会用中文消息进行传递。twisted默认使用utf8进行编码【1】,一般情况下,只需要在服务器端用utf8进行编码,客户端则可以自动地将数据解析成功。

但是python2.3在Linux下却无法使用encode utf8功能。因此中文消息无法在CS之间传递。

为了能正确传递中文消息,最后采用的解决方法是:在服务器端用base64编码,然后在客户端用base64解码【2】。这种方法可以正确解决这个问题。

Reference:

1. http://twistedmatrix.com/pipermail/twisted-web/2007-October/003551.html
2. http://blog.csdn.net/lxdcyh/archive/2009/03/24/4021476.aspx

Twisted是一个非常流行的,完全事件驱动的网络框架。

目前我的项目中,急需要一种流行的、稳定的,C/S结构的Python网络编程框架。我的选择有很多:Socket, SocketServer, Twisted, RPyC, XMLRPC…… 。

Socket是非常古老底层的框架,用它来编程有让人回到远古时代的感觉。SocketServer是比较成熟的模块了,但是它不支持RPC远程调用,且也比较古老了。XMLRPC与SocketServer差不多。RPyC看起来挺新的,但是开发者、文档都很少,稳定性不佳。Twisted是一个成熟、开发者众多、文档丰富的强大的网络框架,因此,我将它作为项目的C/S框架。

Twisted最新版本是11.0,它支持Python2.4-2.7. Twisted支持Python2.3的最近版本是9.0【1】. 下面将描述在Linux下安装Twisted9.0+Python2.3 与 在Windows下安装Twisted11.0+Python2.7的方法。

开源的项目在Windows平台下支持都不是很好。对于Python2.3来说,Twisted是没有已经编译好的.exe版本来支持它的(对于Python2.4-2.7,Twisted都有良好的支持的.exe版本)。因此,为了在Windows的Python2.3下使用Twisted来说,只能自己编译源码。然而,编译源码是非常困难的。我建议还是作罢,不要有这种想法。因此,在Windows下,我们是不能用Python2.3来进行Twisted编程的。也正是这个原因,我在Windows下的开发环境是:Python2.7+Twisted11.0。安装Twisted11.0之后,很有可能,你在导入from twisted.internet import protocol, reactor时会报错:

ImportError: No module named zope.interface

解决办法可参考【2】,下载zope.interface 3.6.2即可解决。

继续阅读

www.liaoqiqi.com网站PR查询 博客简洁版 博客Google_Site_Map 博客Baidu_Site_Map ?