Bottle路由中全局变量消失
我正在使用Bottle作为Python的网页框架。
基本上,我在做的事情是:
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
代码的部分)和处理请求的线程之间并没有共享全局变量(当我访问/auth
这个网址时,logger
仍然是None
)。
通过在load()
函数和auth()
路由中打印id(logger)
(加上global logger
,只是为了确认),我得到了两个不同的ID。
我该如何让我的日志记录器在处理请求的线程之间共享呢?
附注:我尝试在默认的Bottle应用中添加一个字段,像这样:
app = default_app()
app.logger = # mylogger
然后在路由中:
app = default_app()
app.logger.debug('Message')
但似乎即使是default_app()
也是不同的。
1 个回答
1
我该如何将我的日志记录器分享给处理请求的线程呢?
...
通过在函数load()和路由auth()中打印id(logger)(加上一个全局日志记录器,以确保准确),我得到了两个不同的id。
这没问题——你的日志记录器变量不需要引用同一个日志对象,线程之间也能正常工作。
每个线程只需要获取自己的日志记录器:
logger = logging.getLogger('foo.bar.baz')
这样就可以正常工作了。(注意,这是在线程之间,而不是在进程之间,请注意这一点。)
顺便问一下,我不太确定你的Webserver.getLogger
函数返回什么,但无论如何,这个函数似乎是多余的。
另外,我很好奇——你真的在日志输出中遇到了问题,还是只是因为看到不同日志变量的id
不一样而感到惊讶?