我正在开发一个带有flask的Web应用程序,该烧瓶可作为进行计算的python库的接口(通常很耗时)。
对服务器的每次调用都用一个标识符标识,我想将对库的调用日志写入依赖于给定标识符的文件中。
一个最小的工作示例如下。
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')
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
,但是两种计算的日志都对应于对{{1 }}转到两个文件。也就是说,call_computation
和computations-A.log
这两个文件都具有例如以下行:
computations-B.log
有人可以帮助我,以便调用该库以转到适当的日志文件吗?请注意,原则上我不能修改进行计算的程序包,因此我无法在该程序包中创建更多记录器。
谢谢!
答案 0 :(得分:0)
解决方案是过滤日志记录。在server.py
文件中,创建logging.Filter
的子类:
class MyFilter(logging.Filter):
def __init__(self, thread_id):
super(MyFilter, self).__init__()
self.thread_id = thread_id
def filter(self, record):
return record.thread == self.thread_id
并在设置处理程序时,添加此类的实例:
myfilter = MyFilter(threading.current_thread().ident)
fh.addFilter(myfilter)
这样,当日志记录到达过滤器时,如果创建日志的线程与创建过滤器的线程相同,则它将传递到下一级;否则它将被过滤掉。