考虑以下日志记录示例。有两个python文件,myapp.py和mylib.py。
# mylib.py
import logging
def do_something():
lgr = logging.getLogger('test')
lgr.info('Doing something')
INFO:test:[123] Started
INFO:test:Doing something
INFO:test:[123] Finished
执行myapp.py时,会将以下输出提供给日志文件:
INFO:test:[123] Started
INFO:test:[123] Doing something
INFO:test:[123] Finished
我试图获取登录继承从父代码获取的上下文信息。期望的输出:
import firebase_admin
import google.auth.transport.requests
import google.oauth2.id_token
from firebase_admin import auth
from firebase_admin import credentials
这可能吗? (注意" [123]"包含在日志的第2行)
以下是一些其他相关信息:
答案 0 :(得分:1)
您不能轻易地为第三方库执行此操作(因为即使您使用代码,它们也不会使用适配器)。但是,您可以使用过滤器执行此操作,如文档here中所述。
答案 1 :(得分:0)
我接受了Vinay Sajip的回答并应用了它,得到了以下内容。它似乎按我想要的方式工作。希望这也会帮助其他人。谢谢Vinay!
您不能轻易地为第三方库执行此操作(因为即使您使用代码,它们也不会使用适配器)。但是,您可以使用过滤器执行此操作,如文档here中所述。
# myapp.py
import logging
import mylib
class ContextFilter(logging.Filter):
def __init__(self, filter_name, extra):
super(ContextFilter, self).__init__(filter_name)
self.connid = extra
def filter(self, record):
record.connid = self.connid
return True
def main():
logging.basicConfig(filename='myapp.log',level=logging.INFO,
format='%(levelname)s:%(name)s:[%(connid)s] %(message)s')
logger = logging.getLogger('test')
cf = ContextFilter(filter_name='add_conn_id', extra='123')
logger.addFilter(cf)
logger.info('Started')
mylib.do_something()
logger.info('Finished')
if __name__ == '__main__':
main()
我的日志输出现在看起来像这样:
INFO:test:[123] Started
INFO:test:[123] Doing something
INFO:test:[123] Finished
格式更改