格式化tornado.access的默认Python日志记录

时间:2016-05-13 10:48:27

标签: python json logging tornado

我想更改默认tornado.access日志的格式

这是默认的日志格式:

INFO:tornado.access:200 GET / (127.0.0.1) 1.09ms

这是我的记录配置:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose_json': {
            'format': """
            {
                Time: %(asctime)s,
                Level: %(levelname)s ,
                Name: %(name)s:%(lineno)s,
                Message: %(message)s
            }
            """,
            'datefmt' : "%d-%b-%Y %H:%M:%S"
        },
    },
    'filters': {
    },
    'handlers': {
        'console': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'formatter': 'verbose_json'
        },
    },
    'loggers': {
        '': {
            'handlers': ['console'],
            'level': 'INFO',
        },
    }
}

这就是我在app.py服务器启动器文件中加载配置文件的方式:

logging.config.dictConfig(LOGGING)

此配置生成此格式化日志:

  {
        Time: 13-May-2016 16:19:03,
        Level: INFO ,
        Name: tornado.access:1946,
        Message: 200 POST / (127.0.0.1) 0.93ms
  }

但是我想把它显示为json,格式如下所示,节点可以包含内部json:

{   
  Time: 13-May-2016 16:19:03,    
  Level: INFO ,    
  Name: tornado.access:1946,  
  Message: {
     Status_Code: 200,
     Method: POST,
     URL: /,
     Remote_IP: 127.0.0.1,
     Elapse_Time: 0.93ms  
  } 
}

1 个答案:

答案 0 :(得分:1)

要获得更详细的信息,您需要向log_function提供Application

def log_function(handler):
    info = {
        'Status_Code': handler.get_status(),
        'Method': handler.request.method,
        'URL': handler.request.uri,
        'Remote_IP': handler.request.remote_ip,
        'Elapsed_Time': '%.2fms' % (handler.request.request_time()*1000)
    }
    tornado.log.access_log.info(json.dumps(info, indent=4))

# try it out with a dummy application
app = Application([], log_function=log_function)
app.listen(8888)
IOLoop.current().run_sync(lambda: AsyncHTTPClient().fetch(
    'http://localhost:8888/', follow_redirects=False, raise_error=False))