Frage

Also, wenn sie mit der Entwicklung zu spielen ich settings.DEBUG nur einstellen True und wenn ein Fehler occures kann ich es schön formatierte, mit gutem Stack-Trace und fordert Informationen.

Aber auf Art von Produktionsstätte Ich würde eher DEBUG=False und Messebesucher einige Standardfehler 500 Seiten mit Informationen verwenden, die ich über die Festsetzung dieser Fehler in diesem Moment gerade arbeite;)
Zugleich würde Ich mag eine Möglichkeit haben, all diese Informationen Protokollierung (Stack-Trace und Anfrage info) in einer Datei auf meinem Server - so kann ich nur zur Ausgabe in meiner Konsole und beobachten Fehler blättern, E-Mail, das Protokoll zu mir jede Stunde oder so etwas.

Welche Logging-Lösungen würden Sie für eine django-Website empfehlen würde, dass diese einfachen Anforderungen erfüllen? Ich habe die Anwendung als fcgi-Server ausgeführt wird, und ich bin mit Apache-Webserver als Frontend (obwohl gehen zu lighttpd denken).

War es hilfreich?

Lösung

Nun, wenn DEBUG = False, Django wird automatisch eine vollständige Rückverfolgung eines Fehlers für jede Person in der ADMINS Einstellung aufgeführt Mail, die Sie Benachrichtigungen ziemlich kostenlos bekommt. Wenn Sie mehr feinkörnige Steuerung erhalten möchten, können Sie Ihre Einstellungen eine Middleware-Klasse schreiben und hinzufügen, die eine Methode namens process_exception() definiert, die Zugriff auf die Ausnahme haben wird, die ausgelöst wurde:

http://docs.djangoproject.com/en / dev / Themen / http / Middleware / # Prozess-Ausnahme

Ihre process_exception() Verfahren können dann durchführen wie auch immer geartete Du die Protokollierung mag. Zu trösten Schreiben in eine Datei schreiben, usw., usw.

Edit: wenn es etwas weniger nützlich ist, können Sie auch für das got_request_exception Signal hören, die gesendet werden, wenn eine Ausnahme während der Anforderungsverarbeitung auftreten:

http://docs.djangoproject.com/en / dev / ref / Signale / # got-Anfrage-Ausnahme

Dies ist nicht gibt Sie auf das Ausnahmeobjekt zuzugreifen, jedoch, so dass die Middleware-Methode viel einfacher zu handhaben ist.

Andere Tipps

Django Sentry ist ein guter Weg zu gehen, wie bereits erwähnt, aber es ist ein wenig Arbeit beteiligt sie richtig einrichten (als separate Website). Wenn Sie einfach alles auf eine einfache Textdatei hier anmelden möchten ist die Protokollierungskonfiguration in Ihrer settings.py setzen

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        # Include the default Django email handler for errors
        # This is what you'd get without configuring logging at all.
        'mail_admins': {
            'class': 'django.utils.log.AdminEmailHandler',
            'level': 'ERROR',
             # But the emails are plain text by default - HTML is nicer
            'include_html': True,
        },
        # Log to a text file that can be rotated by logrotate
        'logfile': {
            'class': 'logging.handlers.WatchedFileHandler',
            'filename': '/var/log/django/myapp.log'
        },
    },
    'loggers': {
        # Again, default Django configuration to email unhandled exceptions
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
        # Might as well log any errors anywhere else in Django
        'django': {
            'handlers': ['logfile'],
            'level': 'ERROR',
            'propagate': False,
        },
        # Your own app - this assumes all your logger names start with "myapp."
        'myapp': {
            'handlers': ['logfile'],
            'level': 'WARNING', # Or maybe INFO or DEBUG
            'propagate': False
        },
    },
}

django-db-log, in einer anderen Antwort erwähnt, wurde ersetzt durch:

https://github.com/dcramer/django-sentry

Offensichtlich James ist richtig, aber wenn man in einem Datenspeicher Ausnahme anmelden will, gibt es ein paar Open-Source-Lösungen, die bereits zur Verfügung:

1) Crashlog ist eine gute Wahl: http://code.google.com/ p / django-Crashlog /

2) Db-Log ist eine gute Wahl als gut: http: // code.google.com/p/django-db-log/

Was ist der Unterschied zwischen den beiden? Fast dass nichts, was ich sehen kann, also entweder eine genügt.

Ich habe beide verwendet und sie funktionieren gut.

Einige Zeit ist vergangen seit EMP am nützlichsten Code Vorlage übergeben. Ich jetzt gerade umgesetzt es, und während mit einiger manage.py Option Dreschen um, um zu versuchen, einen Fehler zu jagen, habe ich eine deprecation Warnung an den Effekt, dass mit meiner aktuellen Version von Django (1.5.?) Ein require_debug_false Filter ist jetzt erforderlich für den mail_admins Handler.

Hier ist der überarbeitete Code:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
         'require_debug_false': {
             '()': 'django.utils.log.RequireDebugFalse'
         }
     },
    'handlers': {
        # Include the default Django email handler for errors
        # This is what you'd get without configuring logging at all.
        'mail_admins': {
            'class': 'django.utils.log.AdminEmailHandler',
            'level': 'ERROR',
            'filters': ['require_debug_false'],
             # But the emails are plain text by default - HTML is nicer
            'include_html': True,
        },
        # Log to a text file that can be rotated by logrotate
        'logfile': {
            'class': 'logging.handlers.WatchedFileHandler',
            'filename': '/home/username/public_html/djangoprojectname/logfilename.log'
        },
    },
    'loggers': {
        # Again, default Django configuration to email unhandled exceptions
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
        # Might as well log any errors anywhere else in Django
        'django': {
            'handlers': ['logfile'],
            'level': 'ERROR',
            'propagate': False,
        },
        # Your own app - this assumes all your logger names start with "myapp."
        'myapp': {
            'handlers': ['logfile'],
            'level': 'DEBUG', # Or maybe INFO or WARNING
            'propagate': False
        },
    },
}

Ich hatte nur ein lästiges Problem mit meinem fcgi Skript. Es kam vor django einmal begonnen. Der Mangel an Protokollierung ist sooo schmerzhaft. Wie auch immer, in eine Datei als erste, was Umleiten Stderr hat mir sehr geholfen:

#!/home/user/env/bin/python
sys.stderr = open('/home/user/fcgi_errors', 'a')
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top