2014-11-08 228 views
2

我通过Python logging模块将事件记录到控制台。 我也想通过socket-io(flask)将这些日志消息发送给客户端。 以下方法仅部分成功。将控制台日志输出重定向到flask-socketio

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

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) 

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

希望这会有所帮助!

+0

感谢您的回复。我之前也尝试过。它不适合我... http://pastebin.com/raw.php?i=D3x1usXe – wenzul 2014-11-11 11:50:30

相关问题