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

本文介绍了一种使用python-message库改进日志记录的方法,通过引入该库,可以轻松实现不同项目间的日志兼容性,避免因日志配置差异导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假定你在编写一个非常牛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,相信此时你也可以轻松应对了,:)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值