将控制台日志记录输出重定向到flask-socketio

时间:2014-11-08 13:22:59

标签: python logging flask flask-socketio

我通过Python logging模块将事件记录到控制台。 我还想通过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

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

1 个答案:

答案 0 :(得分:1)

sendemit函数是上下文感知函数,只能在事件处理程序内部工作。 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)

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

希望这有帮助!