Python/Django:在runserver下打印日志到控制台,在Apache下打印日志到文件

125 投票
6 回答
181055 浏览
提问于 2025-04-16 09:11

我想知道在用 manage.py runserver 运行我的 Django 应用时,怎么能把调试信息发送到控制台(就像用 print 一样),而在用 Apache 运行应用时,又能把这些信息发送到一个日志文件里。

我查看了 Django 的日志记录,虽然我对它的灵活性和可配置性印象深刻,但对于我这个简单的需求,还是搞不清楚该怎么做。

6 个回答

29

你可以在你的 settings.py 文件里设置日志记录。

这里有一个例子:

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'
    )

不过,这个设置是依赖于 DEBUG 的状态,也就是说你可能不想一直担心这个设置。想了解更好的写法,可以看看这个链接:如何判断我的 Django 应用是否在开发服务器上运行?。补充一下,上面的例子是来自 Django 1.1 的项目,自那以后,Django 的日志配置有了一些变化。

109

这里有一个基于Django的日志记录解决方案。它使用的是DEBUG设置,而不是实际检查你是否在运行开发服务器。不过,如果你找到更好的方法来检查这一点,调整起来应该也很简单。

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']

想了解更多细节,可以查看 https://docs.djangoproject.com/en/dev/topics/logging/

92

当你在使用mod_wsgi运行程序时,打印到stderr的文本会出现在httpd的错误日志中。你可以直接使用print,或者选择使用logging来记录信息。

python 3:

print("Goodbye cruel world!", file=sys.stderr)

python 2:

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

撰写回答