Python Tornado:日志信息

Python Tornado:日志信息,python,logging,tornado,Python,Logging,Tornado,我在TornadoAPI(Python)中编写日志时遇到问题 我的应用程序在文件“api.log”中写入日志。始终在0小时(使用logging.handlers.TimedRotatingFileHandlerclass)旋转文件。这样,当前文件名为“api.log.yyyy-mm-dd”,并创建一个新的“api.log”。然后,应用程序继续写入这个新文件。 但是,一些线程仍然在最旧的文件(api.log.yyyy-mm-dd)上写入,而其他线程在新的“api.log”中写入。我总是需要重新启动

我在
Tornado
API(
Python
)中编写日志时遇到问题

我的应用程序在文件
“api.log”
中写入日志。始终在0小时(使用
logging.handlers.TimedRotatingFileHandler
class)旋转文件。这样,当前文件名为
“api.log.yyyy-mm-dd”
,并创建一个新的
“api.log”
。然后,应用程序继续写入这个新文件。 但是,一些线程仍然在最旧的文件
(api.log.yyyy-mm-dd)
上写入,而其他线程在新的
“api.log”
中写入。我总是需要重新启动应用程序来解决问题。 下面是我的代码片段

import logging
import logging.config
import tornado.ioloop
from tornado_json.application import Application
from tornado.httpserver import HTTPServer

import tornado.ioloop
from tornado_json.application import Application
from tornado.httpserver import HTTPServer
from tornado_json.requesthandlers import APIHandler


class HelloWorldHandler(APIHandler):
    def get(self):
        logging.getLogger('api').info('hello world!')
        return "Hello world!"


logging.config.dictConfig({
    'version': 1,
    'formatters': {
        'default': {
            'format': '%(asctime)s %(levelname)s %(message)s'
        },
    },
    'loggers': {
        'api': {
            'level': 'NOTSET',
            'handlers': ['api_handler'],
        }
    },
    'handlers': {
        'api_handler': {
            'class': 'logging.handlers.TimedRotatingFileHandler',
            'when': 'midnight',
            'backupCount': 1,
            'formatter': 'default',
            'filename': 'api.log'
        },
    }
})

app = Application(routes=[('/api/helloworld', HelloWorldHandler)], settings={})

server = HTTPServer(app, xheaders=True)

server.bind(8888)
server.start(150)

tornado.ioloop.IOLoop.instance().start()
问题是:为什么日志循环在某些线程上不起作用?

server.start(150)
启动150个进程,而不是线程。(这是非常多的。使用的进程比CPU多得多是不寻常的)。进程不共享内存,因此每个进程独立决定何时轮换其日志

当您创建这样的多个进程时,日志记录通常很时髦。我建议避免使用
server.start(N)
(对于
N!=1
),并使用类似
supervisord
的流程管理器来启动所需数量的流程。然后,您可以为每个进程提供自己的日志文件,并避免由于将所有内容都从一个父进程分叉而带来的复杂性