我正在开发一个带有烧瓶的 webapp,它充当进行计算(通常很耗时)的 python 库的接口。
对服务器的每次调用都用一个标识符标识,我想将调用库的日志写入一个依赖于给定标识符的文件。
一个最小的工作示例如下。
计算.py
import time
import logging
logger = logging.getLogger(__name__)
def long_computation(identifier):
logger.info('called computation with identifier %s', identifier)
for i in range(100):
logger.info('in step %d of identifier %s', i, identifier)
time.sleep(1)
logger.info('finished computation with identifier %s')
服务器.py
from flask import Flask, request
import logging
import threading
import computations
app = Flask(__name__)
def call_computation(identifier):
fh = logging.FileHandler("computations-%s.log" % identifier)
formatter = logging.Formatter('%(asctime)s %(levelname)-8s %(name)s : %(message)s')
fh.setFormatter(formatter)
fh.setLevel(logging.INFO)
computations.logger.setLevel(logging.INFO)
computations.logger.addHandler(fh)
computations.long_computation(identifier)
computations.logger.removeHandler(fh)
@app.route('/node/<identifier>', methods=['GET','POST'])
def serve_node(identifier):
thread = threading.Thread(target=call_computation, args=(identifier,))
thread.start()
return "I will compute it!"
当我调用服务器时,说它http://127.0.0.1:5000/node/A创建日志文件computations-A.log并正确记录到该文件。但是,如果我再次调用服务器,比如http://127.0.0.1:5000/node/B在第一次计算结束之前,那么它会创建日志文件computations-B.log,但两个计算的日志对应于call_computation对两个文件的不同调用。也就是说,两个文件都有computations-A.log,computations-B.log例如,像这样的行:
2018-08-02 20:31:57,524 INFO computations : in step 56 of identifier B
2018-08-02 20:31:57,799 INFO computations : in step 97 of identifier A
任何人都可以帮助我以便调用库以转到适当的日志文件吗?请注意,原则上我无法修改进行计算的包,因此我无法在该包中创建更多记录器。
提前致谢!