Python Tornado:记录信息

时间:2018-04-05 20:29:58

标签: python logging tornado

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

我的应用程序将日志写入文件"api.log"。始终在0小时(使用logging.handlers.TimedRotatingFileHandler类),文件被旋转。这样,当前文件名为"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()

问题是:为什么日志轮换在某些线程上不起作用?

1 个答案:

答案 0 :(得分:1)

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

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