2

我通过 Pythonlogging模块将事件记录到控制台。我还想通过 socket-io (flask) 将该日志消息发送到客户端。以下方法仅部分成功。

from flask.ext.socketio import send

fmt_str = '%(asctime)s - %(message)s'
formatter = logging.Formatter(fmt_str)
logging.basicConfig(level=logging.INFO, format=fmt_str)

logger = logging.getLogger("")

class SocketIOHandler(logging.Handler):
    def emit(self, record):
        send(record.getMessage())

sio = SocketIOHandler()
logger.addHandler(sio)

我在浏览器中得到结果,但仍然得到

RuntimeError: working outside of request context

对于控制台上的每个发送调用。我认为发送调用的上下文不可用......处理该问题的有用方法是什么?谢谢。

4

1 回答 1

2

sendand函数是上下文感知函数,只能在emit事件处理程序内部工作。等效的上下文无关函数可从socketio实例中获得。示例(对您的应用做出一些可能正确或不正确的假设):

from app import socketio  # flask.ext.socketio.SocketIO instance

fmt_str = '%(asctime)s - %(message)s'
formatter = logging.Formatter(fmt_str)
logging.basicConfig(level=logging.INFO, format=fmt_str)

logger = logging.getLogger("")

class SocketIOHandler(logging.Handler):
    def emit(self, record):
        socketio.send(record.getMessage())

sio = SocketIOHandler()
logger.addHandler(sio)

第一行可能需要适应您的应用程序的结构,但这样您的应用程序将向所有客户端广播日志。

希望这可以帮助!

于 2014-11-10T03:47:07.997 回答