Python Tornado:记录信息

Python Tornado: logging infos

我在 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 这样的进程管理器来启动所需数量的进程。然后,您可以为每个进程提供自己的日志文件,避免因从一个父进程派生所有内容而带来的复杂性。