【问题标题】:Django logging does not work with django shellDjango 日志记录不适用于 django shell
【发布时间】:2018-07-27 22:40:46
【问题描述】:

我在我的 Django 应用程序中设置了日志记录以记录到标准输出和文件。

当我正常运行我的 django 应用程序 (./manage.py runserver) 时,日志会按预期更新。这是一个在我访问以下视图的 url 时成功记录的示例:

# views.py

import logging
logger = logging.getLogger('mylogger')

def test(request):
    logger.error("test")

但是,当我运行 ./manage.py shell 并运行以下命令时,日志不会更新:

import logging
logger = logging.getLogger('mylogger')
logger.error('test')

这是我在 settings.py 中的日志设置:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
    },
    'handlers': {
        'console': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
            'stream': sys.stdout,
        },
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': '../debug.log',
        },
    },
    'loggers': {
        'mylogger': {
            'handlers': ['console', 'file'],
            'level': 'INFO',
            'propagate': True,
        },
    }
}

我是否必须做一些额外的事情才能让日志记录在 shell 中工作?

【问题讨论】:

  • 编辑您的问题,向我们展示在您使用runserver 时有效的日志记录代码,以及settings.py 中的日志记录设置。
  • @JohnGordon 我更新了我的问题。您的评论似乎暗示如果它在 runserver 中工作,日志记录应该在 shell 中工作,因为您试图查看我在哪里错误配置了我的设置。你能确认日志记录应该在 shell 中工作吗?
  • @BUZZY 这不是那个问题的重复。我成功登录到控制台。如果您阅读该问题和我的问题,您会看到我正在正确配置 'loggers' 字典,并使用与我正在调用的名称匹配的记录器
  • @rawbeans 尝试在 sys.stderr 上更改控制台的处理程序流

标签: python django logging


【解决方案1】:

在 Pycharm 中使用 django-shell 期间,我遇到了同样的问题。有两种方法可以解决。

  1. 当你启动 django-shell 时,去手动导入它:

    导入日志; l=logging.getLogger('django.db.backends');l.setLevel(logging.DEBUG);l.addHandler(logging.StreamHandler())

  2. 或者,如果您像我一样使用 Pycharm 专业版,则可以在控制台启动时添加此导入,您可以在 https://www.jetbrains.com/help/pycharm/console-django-console.html 官方文档中看到。 为此,请转到您的 文件 |设置 |构建、执行、部署 |控制台 |适用于 Windows 和 Linux 的 Django 控制台

PyCharm |偏好 |构建、执行、部署 |控制台 |适用于 macOS 的 Django 控制台

并在控制台启动时添加此导入命令。

【讨论】:

    【解决方案2】:

    它应该可以在 shell 中正常工作。它适用于我,具有与您相同的日志记录配置(除了我使用 'ext:://sys.stdout' 而不是 sys.stdout,因为我没有在 settings.py 中导入 sys

    django20 vinay@ubuntu:/tmp/foo$ tail -25 foo/settings.py 
    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'filters': {
        },
        'handlers': {
            'console': {
                'level': 'INFO',
                'class': 'logging.StreamHandler',
                'stream': 'ext://sys.stdout',
            },
            'file': {
                'level': 'DEBUG',
                'class': 'logging.FileHandler',
                'filename': '../debug.log',
            },
        },
        'loggers': {
            'mylogger': {
                'handlers': ['console', 'file'],
                'level': 'INFO',
                'propagate': True,
            },
        }
    }
    
    django20 vinay@ubuntu:/tmp/foo$ python manage.py shell
    Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
    [GCC 5.4.0 20160609] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    (InteractiveConsole)
    >>> import logging; logger = logging.getLogger('mylogger')
    >>> logger.error('foo')
    foo
    >>> logger.warning('bar')
    bar
    >>> logger.info('baz')
    baz
    >>> logger.debug('boz')
    >>> 
    
    django20 vinay@ubuntu:/tmp/foo$ more ../debug.log 
    foo
    bar
    baz
    

    这是使用带有 Django 2.0 安装的全新 virtualenv,但它应该与旧版本的 Django 完全相同。

    【讨论】:

      猜你喜欢
      • 2016-11-03
      • 2011-09-16
      • 1970-01-01
      • 2011-04-06
      • 2018-06-05
      • 2013-09-11
      • 2020-02-25
      • 1970-01-01
      • 2020-05-27
      相关资源
      最近更新 更多