2016-03-30 3 views
1

я определил конфигурацию протоколирования для моего приложения Python:Вход для нескольких файлов в Python 3

from logging import config 
from os.path import expanduser 


def load_logconfig(app): 

    home = expanduser('~') 
    default_file_prefix = 'my_app' 
    default_log_level = 'DEBUG' if 'debug_mode' in app.registry.settings else 'WARN' 
    extra_loggers = ['requests', 'selenium', 'easyprocess', 'transaction', 'pyvirtualdisplay'] 
    excludes = ['defaults', 'temp', 'test'] 

    default_logging = { 
     'version': 1, 
     'formatters': { 
      'short': { 
       'format': '%(asctime)s\t%(message)s', 
      }, 
      'long': { 
       'format': '%(asctime)s %(levelname)-5.5s [%(threadName)s]\t%(message)s' 
      }, 
      'generic': { 
       'format': '%(asctime)s %(levelname)-5.5s [%(name)s][%(threadName)s]\t%(message)s' 
      } 
     }, 
     'handlers': { 
      'console': { 
       'level': default_log_level, 
       'class': 'logging.StreamHandler', 
       'stream': 'ext://sys.stdout', 
       'formatter': 'long' 
      }, 
      'debuglog': { 
       'class': 'logging.handlers.RotatingFileHandler', 
       'level': default_log_level, 
       'filename': '{}/logs/my_app/debug.log'.format(home), 
       'formatter': 'generic', 
       'maxBytes': 102400000, 
       'backupCount': 20, 
       'encoding': 'utf8' 
      }, 
      'warnlog': { 
       'class': 'logging.handlers.RotatingFileHandler', 
       'level': 'ERROR', 
       'filename': '{}/logs/my_app/error.log'.format(home), 
       'formatter': 'generic', 
       'maxBytes': 102400000, 
       'backupCount': 20, 
       'encoding': 'utf8' 
      } 
     }, 
     'loggers': { 
      'sqlalchemy': {'level': 'INFO', 'qualname': 'sqlalchemy.engine', 'propagate': False}, 
     }, 
     'root': { 
      'level': default_log_level, 
      'handlers': ['console', 'debuglog', 'warnlog'], 
      'propagate': False 
     } 
    } 

    for logger in extra_loggers: 
     default_logging['loggers'][logger] = {'level': 'WARN', 'qualname': logger, 'propagate': False} 

    for endpoint in app.registry.cornice_services: 
     endpoint_name = endpoint.split('/')[1] 
     handler_name = '{}_{}'.format(default_file_prefix, endpoint_name) 
     if handler_name not in default_logging['handlers'] and len(endpoint_name) > 0 and endpoint_name not in excludes: 
      default_logging['handlers'][handler_name] = { 
       'level': default_log_level, 
       'class': 'logging.handlers.RotatingFileHandler', 
       'filename': '{}/logs/my_app/{}_{}.log'.format(home, default_file_prefix, endpoint_name), 
       'formatter': 'generic', 
       'maxBytes': 102400000, 
       'backupCount': 20, 
       'encoding': 'utf8' 
      } 
      default_logging['root']['handlers'].append(handler_name) 

    config.dictConfig(default_logging) 

и у меня есть вспомогательные функции, которые я использую для регистрации:

import logging 


def write_log(request, loglevel, message, mongo_log=False, send_email=False, **kwargs): 
    requested_name = request.path.split('/')[1] 
    log = logging.getLogger('my_app_{}'.format(requested_name)) 
    level = logging.getLevelName(loglevel.upper()) 
    msg = '[{}] [{}] {}'.format(request.remote_addr, request.method, message) 

    log.log(level, msg) 

    # do some other stuff... 

    return True 

и ее использование довольно просто:

write_log(request, 'debug', 'some informative message', send_email=True) 

Что я хотел бы достичь здесь, это написать сообщения журнала в разных файлах на основе на том, что я называю здесь endpoint - например. если запрашивается конечная точка users, сообщения должны быть записаны в файле my_app_users.log. Сообщения от companies Конечная точка должна быть записана в файле my_app_companies.log и т. Д.
С моей текущей настройкой сообщения журнала записываются во всех файлах, но я просто не могу понять, почему. Я предполагаю, что, возможно, я неправильно понял использование logging.getLogger(), но я не уверен, как правильно адресовать handler, который я хочу использовать каждый раз.

ответ

1

А хорошо, после еще одного чтения о logging, я понял, что не добавил вещей, которые мне нужны, в default_logging['loggers']. Как только я определил их там, все работало так, как ожидалось.

Смежные вопросы