tornado日志使用詳解


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('測試日志輸出')

運行后日志文件內容:

tornado中會將logging的輸出級別設置為info

3.http訪問日志
tornado中http訪問的日志是由access_log處理器完成的,access_log繼承了根logger,因此,
access_log處理器也會將日志輸出到示例中的日志文件中,如下所示:

import logging
import datetime

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

運行后日志文件內容:

查看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

運行后日志文件內容:

在輸出格式中,增加了訪問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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM