[转贴]用 python-message 为程序库和日志模块解耦

假定你在编写一个非常牛X的程序库,姑且为它取名为 foo,里面有一个函数叫 bar,你就想啊,这么牛X的一个函数,肯定要写一下 log 啊,所以你就写了以下代码:

def bar(): 
    print 'Haha, Calling bar().' 
    do_sth() 

你高高兴兴发了版本,大家都过得很好。过了几天,公司的另一个项目组听闻牛人您写了个库叫 foo,非常好用,就拿去用了。当天,快下班的时候,你被拖去救火,因为出 Bug 了呀。你查看了很久日志,都没有发现他们调用 bar() 的痕迹,一问,原来他们是用 logging 的,标准输出在做 Daemon 的时候被重定向到 /dev/null 去了……。

好吧,你忍。但没法忍啊,你们原来的项目又不用 logging,你在程序库里引入 logging 谁来初始化它呢?就算你引入了 logging,你们项目获取 logger 可能是用 logging.getLogger('prjA'),另一个项目可能是用 logging.getLogger('prjB'),日后还有新项目呢,想到这个你就蛋疼了。忍痛割爱,把 print 语句给删除掉?你又怕日后出了问题你自己都找不到 Bug 那还不是自己加班自己苦……。

这个时候,不妨让 python-message 来帮你手,轻松改一下 bar() 函数

import message
LOG_MSG = ('log', 'foo')
def bar():
    messeage.pub(LOG_MSG, 'Haha, Calling bar().')
    do_sth()

而在你的项目中,只需要在项目开始处加上这样的代码:

import message
import foo
def handle_foo_log_msg(txt):
    print txt
message.sub(foo.LOG_MSG, handle_foo_log_msg)

而很类似地,在另一个项目 prjA 里,你可以把 handle_foo_log_msg() 稍作修改:

def handle_foo_log_msg(txt):
    import logging
    logging.debug(txt)

在另一个 prjB 里则可能是这样:

import logging
logger = logging.getLogger("prjB")
def handle_foo_log_msg(txt):
    logger.debug(txt)

如果还有另一个 prjC 使用了其它的 log,相信此时你也可以轻松应对了,:)

你可能感兴趣的:(message)