博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
tornado日志使用详解
阅读量:7237 次
发布时间:2019-06-29

本文共 2842 字,大约阅读时间需要 9 分钟。

1.需求

将http访问记录,程序自定义日志输出到文件,按天分割,保留最近30天的日志。

2.使用示例

init_logging("%s/QYK.%s.%s.log" % (log_path, tornado.options.options.mode, tornado.options.options.port))def init_logging(log_file):    # 使用TimedRotatingFileHandler处理器    file_handler = TimedRotatingFileHandler(log_file, when="d", interval=1, backupCount=30)    # 输出格式    log_formatter = logging.Formatter(        "%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s] [%(lineno)d]  %(message)s"    )    file_handler.setFormatter(log_formatter)    # 将处理器附加到根logger    root_logger = logging.getLogger()    root_logger.addHandler(file_handler)logging.info('测试日志输出')

运行后日志文件内容:

300946-20171015131443684-1789570248.png
tornado中会将logging的输出级别设置为info

3.http访问日志

tornado中http访问的日志是由access_log处理器完成的,access_log继承了根logger,因此,
access_log处理器也会将日志输出到示例中的日志文件中,如下所示:

import loggingimport datetimeclass Test1Handler(ApiHandler):    async def get(self, *args, **kwargs):        self.return_success_response()        return

运行后日志文件内容:

300946-20171015131453699-1641181247.png
查看tornado源码tornado\web.py,可以看到access_log的输出格式:

def log_request(self, handler):    """Writes a completed HTTP request to the logs.    By default writes to the python root logger.  To change    this behavior either subclass Application and override this method,    or pass a function in the application settings dictionary as    ``log_function``.    """    if "log_function" in self.settings:        self.settings["log_function"](handler)        return    if handler.get_status() < 400:        log_method = access_log.info    elif handler.get_status() < 500:        log_method = access_log.warning    else:        log_method = access_log.error    request_time = 1000.0 * handler.request.request_time()    log_method("%d %s %.2fms", handler.get_status(),               handler._request_summary(), request_time)

如何自定义http访问日志的输出格式呢?通过源码,可知有两种方法可以解决这个问题

1)我们可以在Application中自定义一个log_function即可

def log_func(handler):    if handler.get_status() < 400:        log_method = access_log.info    elif handler.get_status() < 500:        log_method = access_log.warning    else:        log_method = access_log.error    request_time = 1000.0 * handler.request.request_time()    log_method("%d %s %s (%s) %s %s %.2fms",               handler.get_status(), handler.request.method,               handler.request.uri, handler.request.remote_ip,               handler.request.headers["User-Agent"],               handler.request.arguments,               request_time)class QYKApplication(tornado.web.Application):    def __init__(self, config, webpack_setting, _redis, session_class):        settings = dict()        settings["log_function"] = log_func

运行后日志文件内容:

300946-20171015131504355-931130970.png
在输出格式中,增加了访问url,ip,代理服务器,参数等信息
2)重写RequestHandler的_request_summary方法

def _request_summary(self):    return "%s %s (%s) %s\n%s" % (self.request.method, self.request.uri,        self.request.remote_ip, self.request.headers["User-Agent"],        self.request.arguments)

转载地址:http://serfm.baihongyu.com/

你可能感兴趣的文章
(旧) 1- 大家一起学:Flask构建弹幕微电影网站-(一)-(三)合集:数据模型设计映射成表...
查看>>
vuex组件 vuex-persistedstate
查看>>
靠谱的 关闭Windows10自动更新
查看>>
Ocelot简易教程(二)之快速开始2
查看>>
Elide 4.3.1 发布,雅虎开源的应用数据 API 搭建平台
查看>>
[Docker]Docker镜像
查看>>
如何抓取WebClient、HttpWebRequest、WebRequest无法获取的网页源码,下面将为你解答...
查看>>
[HBase]HBase安装
查看>>
微服务 到底解决了什么问题?非用不可吗?
查看>>
基本概念
查看>>
【Web API系列教程】1.2 — Web API 2中的Action Results
查看>>
Memcached的扩容源码分析
查看>>
DOM操作之--元素的创建,添加,删除
查看>>
关于Vue.js和React.js,听听国外的开发者怎么说?
查看>>
4.variables
查看>>
2.sparkSQL--DataFrames与RDDs的相互转换
查看>>
鼠标放上超链接显示背景效果
查看>>
【小摘抄】关于C++11下 string各类用法(持续更新)
查看>>
淘宝Buy+九月上线测试,你说靠谱吗?
查看>>
erlang的函数
查看>>