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