【问题标题】:tornado deploy django and the log repeat outputtornado deploy django 和日志重复输出
【发布时间】:2018-06-15 10:03:20
【问题描述】:

在我的项目中,我使用 tornado 服务器部署了我的 django-project,我的 tornado 主要功能是:

def main():
    tornado.options.options.logging = None
    tornado.options.parse_command_line()
    os.environ['DJANGO_SETTINGS_MODULE'] = 'Zero.settings'
    application = get_wsgi_application()
    container = tornado.wsgi.WSGIContainer(application)
    http_server = tornado.httpserver.HTTPServer(container, xheaders=True)
    http_server.listen(tornado.options.options.port)
    tornado.ioloop.IOLoop.current().start()

当我使用tornado.options.options.logging = None 禁用龙卷风日志输出,但它仍然在我的控制台中输出日志消息两次时,我的 django 日志配置是:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
       'standard': {
            'format': '%(asctime)s [%(threadName)s] [%(name)s:%(funcName)s] [%(levelname)s]- %(message)s'}
    },
    'filters': {
    },
    'handlers': {
        'error': {
            'level': 'ERROR',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(BASE_DIR, 'log', 'error.log'),
            'maxBytes': 1024*1024*5,
            'backupCount': 5,
            'formatter': 'standard',
        },
        'console':{
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'standard'
        },
    },
    'loggers': {
        'django': {
            'handlers': ['console'],
            'level': 'INFO',
            'propagate': True
        },
    }
}

最终结果是:

2018-06-15 17:40:55,724 [MainThread] [base_views:get] [INFO]- get message correct
INFO:base_views:get message correct

那么我能做些什么来解决这个问题。 谢谢你。

【问题讨论】:

  • 为什么要在 Tornado 上运行 Django?这种架构效率很低。
  • @xyres 因为我需要大量的 HTTP 持久连接,而 Tornado 可以轻松做到这一点。当处理许多请求时,uwsgi 服务器会重新启动,所以我选择 Tornado。

标签: django logging tornado


【解决方案1】:

您只配置了django 记录器,而不是根记录器。当 Tornado 发现根记录器未配置时,它会添加自己的 last-resort 处理程序(使用 logging.basicConfig 而不是 tornado.log)。由于 python 记录器的传播方式,这会导致任何其他记录器被复制。

当您使用tornado.options.options.logging = None 时,您应该确保自己配置根记录器,或使用propagate=False 配置所有其他处理程序。在这种情况下,请将配置的 loggers.django 部分移动到新的 root 部分:

'handlers': {...}
'root': {
  'handlers': ['console'],
  'level': 'INFO',
},

【讨论】:

    猜你喜欢
    • 2020-11-03
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 2016-02-21
    • 1970-01-01
    相关资源
    最近更新 更多