如何在烧瓶中的不同模块中记录请求特定信息

时间:2019-08-09 09:01:25

标签: python python-2.7 api logging flask

我有一个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的值必须仅在一个请求的范围内。

0 个答案:

没有答案