我使用Bottle作为Python Web框架。
基本上,这就是我正在做的事情:
auth.py :
from bottle import get
logger = None
webserver = None
def load(server):
global logger, webserver
logger = server.getLogger('auth')
webserver = server
@get('/auth')
def auth():
logger.debug('Entering route')
webserver.py :
import bottle
import imp
class WebServer(object):
# ...
def getLogger(self, name):
# ...
def start_wsgi(self):
# ...
app = bottle.default_app()
mod = imp.load_source('auth', 'auth.py')
mod.load(self)
# ...
return app
# ...
ws = WebServer()
app = ws.start_wsgi()
注意:此处没有错误处理或额外代码,我刚刚暴露了该问题的有趣内容(在我看来)
似乎全局范围不在主进程(运行WebServer
代码)和处理请求的线程之间共享(logger
仍然是None
当我点击/auth
网址)。
在功能id(logger)
中打印load()
并添加路由auth()
(添加了global logger
,以确定无效),我得到两个不同的ID。
如何将记录器共享给处理请求的线程?
PS:我尝试在默认的Bottle应用中添加一个字段,如下所示:
app = default_app()
app.logger = # mylogger
然后在路线中:
app = default_app()
app.logger.debug('Message')
但似乎即使default_app()
也不同。
答案 0 :(得分:1)
如何将记录器共享给处理请求的线程?
...
通过在函数load()中打印id(logger)并路由auth()(添加了全局记录器,只是为了确定),我得到两个不同的ID。
没关系 - 您的记录器变量不需要引用相同的记录器对象,以便在线程之间正常工作。
每个线程都应该只获取其记录器:
logger = logging.getLogger('foo.bar.baz')
那会很好用。 (通过线程,请注意,not across processes。)
顺便说一下,我不确定你的Webserver.getLogger
函数返回什么,但无论如何这个函数似乎没必要。
P.S。,好奇 - 您实际上是否看到了日志记录输出的问题,或者当您发现不同记录器变量的id
不相同时,您是否感到惊讶?