2016-04-18 22 views
1

Ich implementiere Django in einem Projekt anmelden. Ich habe es so funktioniert, dass Protokolleinträge in einer Datei in unserer Entwicklungsumgebung und in einer Datenbank in unserer Produktionsumgebung eingefügt werden.Django-Protokollierung, Protokollierung in Datei in Entwicklung, ohne die Datei in Produktion erstellen zu müssen

Das Problem, das ich habe, ist, dass Django die Protokolldatei erstellen muss, auch wenn sie in Nicht-Entwicklungsumgebungen leer ist.

Gibt es eine bessere Möglichkeit, dies zu implementieren, so dass die leere Protokolldatei nicht in Nicht-Entwicklungsumgebungen erstellt wird?

Mein Code:

settings.py Logging-Konfiguration:

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'filters': { 
     'require_debug_false': { 
      '()': 'django.utils.log.RequireDebugFalse' 
     }, 
     'is_not_dev_environment': { 
      '()': 'lib.log.log.IsNotDevEnvironment' 
     }, 
     'is_dev_environment': { 
      '()': 'lib.log.log.IsDevEnvironment' 
     } 
    }, 
    'formatters': { 
     'standard': { 
      'format': "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s", 
      'datefmt': "%d/%b/%Y %H:%M:%S" 
     }, 
     'custom': { 
      'format': CUSTOM_LOGGING_FORMAT, 
      'datefmt': "%d/%b/%Y %H:%M:%S" 
     }, 
    }, 
    'handlers': { 
     'mail_admins': { 
      'level': 'ERROR', 
      'filters': ['require_debug_false'], 
      'class': 'django.utils.log.AdminEmailHandler' 
     }, 
     'db': { 
      'level': LOGGING_LEVEL, 
      'filters': ['is_not_dev_environment'], 
      'class': 'lib.log.log.DBLogHandler', 
      'formatter': 'custom' 
     }, 
     'file': { 
      'level': LOGGING_LEVEL, 
      'filters': ['is_dev_environment'], 
      'filename': /var/log/django.log, 
      'class': 'lib.log.log.FileLogHandler', 
      'formatter': 'custom', 
     }, 
    }, 
    'loggers': { 
     'django': { 
      'handlers': ['mail_admins'], 
      'level': LOGGING_LEVEL, 
      'propagate': True, 
     } 
    } 
} 
LOGGING['loggers'].update({app: copy.deepcopy(LOCAL_APP_LOGGER) for app in LOCAL_APPS}) 

lib/log/log.py, die die Filterklassen gilt:

class IsNotDevEnvironment(logging.Filter): 
    def filter(self, record): 
     return settings.ENVIRONMENT != 'DEV' 


class IsDevEnvironment(logging.Filter): 
    def filter(self, record): 
     return settings.ENVIRONMENT == 'DEV' 

Antwort

0

ließ ich mich auf einer anderen Option, die meine Anforderungen erfüllt. Das Hauptproblem, das ich hatte, war, dass wir in unserer Testumgebung die Protokolldatei nicht erstellen konnten (Dateien können nicht mit sudo auf dem System unseres CI-Anbieters manipuliert werden). Ich habe das gelöst, indem ich Logik hinzugefügt habe, um die Protokollierung auf Basis einer Umgebungsvariablen in der Testumgebung zu deaktivieren.

tests/config.py:

from logging.config import dictConfigClass 

from django.conf import settings 


def logging_config(config): 
    disable_logging = getattr(settings, 'DISABLE_LOGGING', False) 
    if not disable_logging: 
     dictConfigClass(config).configure() 

Eine Alternative wäre, den Handler zu setzen, basierend auf einem gewissen Logik:

if ENVIRONMENT == 'DEV': 
    LOGGING['handlers'].update({ 
     """ Dict specifying dev handler """ 
    }) 
else: 
    LOGGING['handlers'].update({ 
     """ Dict specifying production handler """ 
    })