我有一个flask应用程序,该应用程序实现了许多REST API。应用程序的结构是这样的-
app.py
(类似于控制器)utils.py
helperClass1.py
helperClass2.py
logger.py
我在app.py
中获得了一个唯一的ID(比如说uID),我想在每个日志行中打印每个POST请求(以简化调试)。
我无法弄清楚如何在记录器中包含该信息,以便所有帮助程序类也可以使用该记录器,并且该唯一ID应该在单个HTTP请求的范围内。
一种解决方案是将uID
传递给所有帮助程序类,并通过从每个帮助程序类调用logger.py
来创建记录器。但这似乎不是一个优雅的解决方案。
是否有任何不错的方法可以做到这一点。像在春季启动中一样,可以通过在单个线程范围内设置uID
并在调用logger时使用该信息来完成此操作。
我不知道如何在python中做到这一点。
# logger.py
def getLogger(level, unique_id=""):
logFormatter = logging.Formatter("[%(asctime)-15s] %(levelname)s - %(container_id)s %(unique_id)s- %(message)s")
logger = logging.getLogger(__name__)
logger.setLevel(level)
#Remove if previous handlers are attached to the logger to prevent duplicate logs
while logger.handlers:
logger.handlers.pop()
if not os.path.exists(config.LOG_CONF['dir']):
os.makedirs(config.LOG_CONF['dir'])
#Get container id of current container and append it to file name.
container_id = os.popen("head -1 /proc/self/cgroup|cut -d/ -f3").read()
fileHandler = logging.FileHandler((config.LOG_CONF['dir'] + '/' + config.LOG_CONF['file']) % str(container_id[:12] + "-" + time.strftime('%Y%m%d')))
fileHandler.setFormatter(logFormatter)
logger.addHandler(fileHandler)
consoleHandler = logging.StreamHandler()
consoleHandler.setFormatter(logFormatter)
logger.addHandler(consoleHandler)
extra = {'container_id':str(container_id[:12]), 'unique_id':unique_id}
logger = logging.LoggerAdapter(logger, extra)
return logger
我的app.py
看起来像这样-
import logging
import requests
import helperClass1
import helperClass2
import logger as logger_mod
logger = logger_mod.getLogger(logging.INFO, "")
@app.route('/foo', methods=['POST'])
def bar():
data = requests.json
uID = data.get('uID')
params1 = data.get('param1')
params2 = data.get('param2')
global logger
# **I want to use this logger in helper classes**
logger = logger_mod.getLogger(logging.INFO, uID)
logger.info("Some Info")
res1 = helperClass1.fun1(params)
res2 = helperClass2.fun2(params)
return response
我想要一种方法,使我的记录器可以被所有模块使用,并且唯一ID的值必须仅在一个请求的范围内。