自定义Tornado请求日志格式

tornado源代码分析

打开site-packages/tornado/log.py,最开头的注释文档说明了tornado的日志模块是直接和logging模块集成的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
"""Logging support for Tornado.

Tornado uses three logger streams:

* ``tornado.access``: Per-request logging for Tornado's HTTP servers (and
potentially other servers in the future)
* ``tornado.application``: Logging of errors from application code (i.e.
uncaught exceptions from callbacks)
* ``tornado.general``: General-purpose logging, including any errors
or warnings from Tornado itself.

These streams may be configured independently using the standard library's
`logging` module. For example, you may wish to send ``tornado.access`` logs
to a separate file for analysis.
"""

其中一共用到了三种被命名的logger

1
2
3
4
# Logger objects for internal tornado use
access_log = logging.getLogger("tornado.access")
app_log = logging.getLogger("tornado.application")
gen_log = logging.getLogger("tornado.general")

access_log 用于记录每一个访问请求

app_log 用于记录程序运行过程中,所有未被处理的异常

gen_log 用于记录tornado自己运行过程中报的错误和警告

tornado日志格式分两块,一块是logging的格式,一块是tornado请求消息格式。

tornado默认的访问日志输出是这样的:

1
WARNING:tornado.access:404 GET / (127.0.0.1) 167.93ms

其中,WARNING:tornado.access:404为logger日志内容,GET / (127.0.0.1) 167.93ms为访问消息。

根据enable_pretty_logging函数,可知tornado默认采用logging的root logger,并且,如果logger没有配置handler,则为其添加一个默认的StreamHandler。
因而,应该为logging root logger预创建Handler,并指定日志格式。

依据tornado文档,输出访问日志的为Application.log_request,如果要自定义访问日志输出,可以继承Application并重写log_request,或者自定义log_request函数,并设置为Application.settings的log_function属性。
当然选择后者。log_function函数的写法,参照原版Application.log_request就行。

我们结合上章学的loguru模块 就可以将访问日志输出到loguru中了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def _log_request(self, handler):

status = handler.get_status()

if status < 400:
if self._settings[r'debug']:
log_method = loguru.logger.debug
else:
return
elif status < 500:
log_method = loguru.logger.warning
else:
log_method = loguru.logger.error

log_method(
r'%d %s %.2fms' % (
handler.get_status(),
handler._request_summary(),
1000.0 * handler.request.request_time()
)
)

logging模块的简单使用以及tornado中的log简介绍

tornado总结10-日志配置

知识就是财富
如果您觉得文章对您有帮助, 欢迎请我喝杯水!