2016-05-13 3 views
2

Я хочу изменить формат по умолчанию tornado.access войтиФормат по умолчанию Python Logging для tornado.access

это формат журнала по умолчанию:

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

Это мой Logging Конфигурация:

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

Чтобы получить более подробную информацию, вам необходимо предоставить 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)) 
Смежные вопросы