Skip to main content
 首页 » 编程设计

python之Tornado websocket 日志记录

2024年08月29日3998°冷暖

我正在尝试使用 Tornado 网络服务器实现网络套接字。

我的设置如下所示:

from tornado.options import options, define, parse_command_line 
import django.core.handlers.wsgi 
import logging 
import tornado.httpserver 
import tornado.ioloop 
import tornado.web 
import tornado.wsgi 
 
from pogows.tornado_sockets import GetSocketHandler, UpdateSocketHandler 
from mobile.cleaner import start_cleaning 
 
define('port', type=int, default=8080) 
tornado.options.options['log_file_prefix'].set('/var/www/pogo_django/logs/tornado_server.log') 
tornado.options.parse_command_line() 
 
<snip> 
 
def main(): 
 
    logger = logging.getLogger(__name__) 
    wsgi_app = tornado.wsgi.WSGIContainer( 
        django.core.handlers.wsgi.WSGIHandler()) 
    tornado_app = tornado.web.Application( 
        [ 
            ('/hello-tornado', HelloHandler), 
            ('/socket/get', GetSocketHandler), 
            ('/socket/update', UpdateSocketHandler), 
            ('.*', tornado.web.FallbackHandler, dict(fallback=wsgi_app)), 
        ], debug=True) 
    logger.info("Tornado POGO server starting...") 
    server = tornado.httpserver.HTTPServer(tornado_app) 
    server.listen(options.port) 
    start_cleaning() 
    tornado.ioloop.IOLoop.instance().start() 

到目前为止,一切看起来都很好, Tornado 日志,我看到了信息消息。 现在,我正在尝试从 websocket 处理程序类中记录一些内容。

class GetSocketHandler(tornado.websocket.WebSocketHandler): 
 
    def open(self): 
        print "opening" 
 
    def on_closed(self): 
        print "closing" 
 
    def on_message(self, message): 
        last_update=datetime.datetime.utcnow().replace(tzinfo=utc) 
        try: 
            print "getting_user" 
    ... 

Tornado 受 supervisord 管辖,具有以下配置:

[program:pogo_tornado] command=/var/www/pogo_django/tornado_server.py user=www-data stdout_logfile=/var/www/pogo_django/logs/pogo_stdout.log stderr_logfile=/var/www/pogo_django/logs/pogo_stderr.log environment=PYTHONPATH="/var/www/pogo_django/",DJANGO_SETTINGS_MODULE="pogo.settings"

我尝试了一些东西。

  1. 只需使用 print 语句,正如您从上面的代码片段中看到的那样,希望 supervisord 能够捕获它并发送到 stdout/stderr 日志。
  2. 在 websocket 类中创建一个单独的 logging.getLogger() 实例并使用它。

它们都没有产生预期的结果。

当我从命令行手动运行 tornado 时,我确实看到打印到控制台的 print 版本,但是 logging 无论如何都不起作用。

我哪里出错了?

请您参考如下方法:

呸,我明白了。我在使用 getLogger() 时没有设置日志记录级别,只是盲目地记录到 DEBUG。

明确使用 logger.setLevel(logging.DEBUG) 向我展示了我在日志中的消息。

显然 Tornado 默认设置了一些其他级别..愚蠢的我。