Python / Django:登录到runserver下的控制台,登录到Apache下的文件


114

print在之下运行Django应用程序时manage.py runserver,如何将跟踪消息发送至控制台(如),而在Apache下运行应用程序时如何将这些消息发送至日志文件?

我回顾了Django日志记录,尽管它对高级用途的灵活性和可配置性给我留下了深刻的印象,但我仍然对如何处理简单的用例感到困惑。


1
最简单的解决方案是为主服务器和开发环境使用不同的settings.py文件,请参阅deploydjango.com/django_project_structure
Alex

Answers:


84

在mod_wsgi下运行时,打印到stderr的文本将显示在httpd的错误日志中。您可以print直接使用,也可以logging改用。

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

2
从技术上讲,它不是有效的WSGI,它将在更严格的环境中触发错误。
Paul McMillan

13
就WSGI而言,将'print'与'sys.stderr'一起使用并没有什么错,并且它不应触发错误。
Graham Dumpleton 2012年

我导入了sys,但这似乎对我不起作用。
Hack-R

17
这在Python 3中不起作用,请看这里。您需要print("Goodbye cruel world!", file=sys.stderr)
小豆蔻

103

这是一个基于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/


8
也可以尝试LOGGING['loggers'][logger]['handlers'] += ['console']
Nir Levy

@ m01:将其配置为settings.py后,如何将其用于打印目的?谢谢
Niks Jain

我将答案中的代码放入settings.py底部,然后进行设置DEBUG = True(在同一文件的顶部附近进行查找)。然后,我python manage.py runserver从终端运行(有关详细信息,请参阅django docs),日志消息将出现在终端窗口中。在生产环境中,我将使用其他settings.py,其中DEBUG = False-日志消息转到/path/to/your/file.log
m01

你的缩进让我头疼。尽管感谢您提供的信息,但它确实有效!
10

谢谢!我已经对缩进进行了一些更改,希望现在更好
-m01

27

您可以配置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中的日志记录配置已有所更改。


我不想依靠调试;我宁愿依赖另一篇文章中链接的dev-server检测机制。但是另一个帖子的检测机制依赖于对请求实例的访问。如何在settings.py中获取请求实例?
贾斯汀·格兰特

4

我用这个:

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 __name__ == '__main__':
    main()

0

您可以使用tagalog(https://github.com/dorkitude/tagalog)轻松完成此操作

例如,当标准python模块写入以附加模式打开的文件对象时,App Engine模块(https://github.com/dorkitude/tagalog/blob/master/tagalog_appengine.py)会覆盖此行为,而是使用logging.INFO

要在App Engine项目中获得此行为,只需执行以下操作:

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

您可以自己扩展模块并覆盖日志功能,而不会遇到太大困难。


0

这在我的local.py中效果很好,省去了常规日志记录的麻烦:

from .settings import *

LOGGING['handlers']['console'] = {
    'level': 'DEBUG',
    'class': 'logging.StreamHandler',
    'formatter': 'verbose'
}
LOGGING['loggers']['foo.bar'] = {
    'handlers': ['console'],
    'propagate': False,
    'level': 'DEBUG',
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.