我在使用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()
问题是:为什么日志轮换在某些线程上不起作用?
答案 0 :(得分:1)
server.start(150)
启动150个进程,而非线程。 (这很多。使用比CPU更多的进程并不常见)。进程不共享内存,因此每个进程都会独立决定何时轮换其日志。
当您创建这样的多个流程时,记录通常很时髦。我建议避免server.start(N)
(对于n != 1
)并使用像supervisord
这样的流程管理器来启动所需数量的进程。然后,您可以为每个人提供自己的日志文件,并避免因从一个父进程分配所有内容而产生的复杂情况。