2016-03-30 10 views
1

ich die Logging-Konfiguration für meine Python App definiert haben:Logging, um mehrere Dateien in 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) 

und ich habe eine Hilfsfunktion, die ich benutze für die Protokollierung:

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 

Und sein Verwendung ist ziemlich einfach:

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

Was ich hier erreichen möchte, ist Protokollnachrichten in verschiedenen Dateien zu erstellen, basierend auf was ich hier nenne endpoint - z.B. Wenn der Endpunkt users angefordert wird, sollten die Nachrichten in die Datei my_app_users.log geschrieben werden. Nachrichten von companies Endpunkt sollte in my_app_companies.log Datei usw. geschrieben werden.
Mit meinem aktuellen Setup, Protokollmeldungen sind in allen Dateien geschrieben, aber ich kann einfach nicht herausfinden, warum. Ich nehme an, es könnte sein, dass ich die Verwendung von logging.getLogger() missverstanden habe, aber ich bin mir nicht sicher, wie ich die handler richtig adressieren soll, die ich jedes Mal verwenden möchte.

Antwort

1

Ah gut, nach einer weiteren Lesung über logging, erkannte ich, dass ich nicht Dinge, die ich brauchte, in default_logging['loggers'] hinzufügen. Sobald ich sie dort definiert habe, hat alles wie erwartet funktioniert.

Verwandte Themen