it-swarm.com.de

Python/Django: Protokollierung in der Konsole unter Runserver, Protokollierung in Datei unter Apache

Wie kann ich Ablaufverfolgungsnachrichten an die Konsole senden (wie print), wenn ich meine Django-App unter manage.py runserver ausführen, diese Nachrichten jedoch an eine Protokolldatei senden lassen, wenn ich die App unter Apache ausführen?

Ich überprüfte Django Logging und obwohl ich von der Flexibilität und Konfigurierbarkeit für fortgeschrittene Anwendungen beeindruckt war, bin ich immer noch begeistert, wie ich mit meinem einfachen Anwendungsfall umgehen kann.

96
Justin Grant

In stderr gedruckter Text wird im Fehlerprotokoll von httpd angezeigt, wenn er unter mod_wsgi läuft. Sie können entweder print direkt oder stattdessen logging verwenden.

print >>sys.stderr, 'Goodbye, cruel world!'

Hier ist eine Django-Protokollierungslösung. Es verwendet die DEBUG-Einstellung, anstatt tatsächlich zu prüfen, ob Sie den Entwicklungsserver betreiben oder nicht. Wenn Sie jedoch einen besseren Weg finden, dies zu überprüfen, sollte es einfach sein, es anzupassen.

LOGGING = {
    'version': 1,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': '/path/to/your/file.log',
            'formatter': 'simple'
        },
    },
    'loggers': {
        'Django': {
            'handlers': ['file'],
            'level': 'DEBUG',
            'propagate': True,
        },
    }
}

if DEBUG:
    # make all loggers use the console.
    for logger in LOGGING['loggers']:
        LOGGING['loggers'][logger]['handlers'] = ['console']

weitere Informationen finden Sie unter https://docs.djangoproject.com/en/dev/topics/logging/ .

93
m01

Sie können die Protokollierung in Ihrer settings.py-Datei konfigurieren. 

Ein Beispiel:

if DEBUG:
    # will output to your console
    logging.basicConfig(
        level = logging.DEBUG,
        format = '%(asctime)s %(levelname)s %(message)s',
    )
else:
    # will output to logging file
    logging.basicConfig(
        level = logging.DEBUG,
        format = '%(asctime)s %(levelname)s %(message)s',
        filename = '/my_log_file.log',
        filemode = 'a'
    )

Dies ist jedoch abhängig von der Einstellung von DEBUG und möglicherweise möchten Sie sich keine Gedanken darüber machen, wie es eingerichtet wird. Siehe diese Antwort auf Wie kann ich feststellen, ob meine Django-Anwendung auf dem Entwicklungsserver läuft oder nicht? für eine bessere Art, diese Bedingung zu schreiben. Bearbeiten: Das obige Beispiel stammt aus einem Django 1.1-Projekt. Die Protokollierungskonfiguration in Django hat sich seit dieser Version etwas geändert.

24
Ben Lopatin

Ich benutze das:

logging.conf:

[loggers]
keys=root,applog
[handlers]
keys=rotateFileHandler,rotateConsoleHandler

[formatters]
keys=applog_format,console_format

[formatter_applog_format]
format=%(asctime)s-[%(levelname)-8s]:%(message)s

[formatter_console_format]
format=%(asctime)s-%(filename)s%(lineno)d[%(levelname)s]:%(message)s

[logger_root]
level=DEBUG
handlers=rotateFileHandler,rotateConsoleHandler

[logger_applog]
level=DEBUG
handlers=rotateFileHandler
qualname=simple_example

[handler_rotateFileHandler]
class=handlers.RotatingFileHandler
level=DEBUG
formatter=applog_format
args=('applog.log', 'a', 10000, 9)

[handler_rotateConsoleHandler]
class=StreamHandler
level=DEBUG
formatter=console_format
args=(sys.stdout,)

testapp.py:

import logging
import logging.config

def main():
    logging.config.fileConfig('logging.conf')
    logger = logging.getLogger('applog')

    logger.debug('debug message')
    logger.info('info message')
    logger.warn('warn message')
    logger.error('error message')
    logger.critical('critical message')
    #logging.shutdown()

if __== '__main__':
    main()
3
xuejunliang

Das funktioniert ziemlich gut in meinem local.py, und ich muss die reguläre Protokollierung nicht durcheinander bringen:

from .settings import *

LOGGING['handlers']['console'] = {
    'level': 'DEBUG',
    'class': 'logging.StreamHandler',
    'formatter': 'verbose'
}
LOGGING['loggers']['foo.bar'] = {
    'handlers': ['console'],
    'propagate': False,
    'level': 'DEBUG',
}
0
jmoz

Das geht ganz einfach mit tagalog (https://github.com/dorkitude/tagalog).

Während das Standard-Python-Modul beispielsweise in ein im Append-Modus geöffnetes Dateiobjekt schreibt, überschreibt das App Engine-Modul (https://github.com/dorkitude/tagalog/blob/master/tagalog_appengine.py) dieses Verhalten und verwendet stattdessen logging.INFO. .

Um dieses Verhalten in einem App Engine-Projekt zu erhalten, können Sie einfach Folgendes tun:

import tagalog.tagalog_appengine as tagalog
tagalog.log('whatever message', ['whatever','tags'])

Sie können das Modul selbst erweitern und die Protokollfunktion ohne großen Aufwand überschreiben.

0
Kyle Wild