【问题标题】:Django class logger not workingDjango 类记录器不工作
【发布时间】:2014-12-09 18:30:05
【问题描述】:

我的 Django 应用程序中有一个名为“Photo”的类,当发生错误时它不会将消息写入我的日志文件。

我的项目层次结构如下所示:

- myproj
  - apps
  - classes
    - classes/__init__.py
    - classes/photo.py

这是我的 LOGGING 配置设置:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
        'standard': {
            'format' : "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
            'datefmt' : "%d/%b/%Y %H:%M:%S"
        },
    },
    'handlers': {
        'null': {
            'level':'DEBUG',
            'class':'django.utils.log.NullHandler',
        },
        'logfile': {
            'level':LOG_LEVEL,
            'class':'logging.handlers.RotatingFileHandler',
            'filename': '/var/log/myproj/apps.log',
            'maxBytes': 50000,
            'backupCount': 2,
            'formatter': 'standard',
        },
        'database_logfile': {
            'level':LOG_LEVEL,
            'class':'logging.handlers.RotatingFileHandler',
            'filename': '/var/log/myproj/database.log',
            'maxBytes': 50000,
            'backupCount': 2,
            'formatter': 'standard',
        },
        'console':{
            'level':LOG_LEVEL,
            'class':'logging.StreamHandler',
            'formatter': 'standard'
        },
        'mail_admins': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler'
            # Only send emails when DEBUG = False
            #'filters': ['require_debug_false'],
        },
    },
    'loggers': {
        'django': {
            'handlers':['console'],
            'propagate': True,
            'level':'WARN',
        },
        'django.request': {
           'handlers': ['mail_admins'],
           'level': 'ERROR',
           'propagate': False,
        },
        'django.db.backends': {
            'handlers': ['database_logfile'],
            'level': 'DEBUG',
            'propagate': False,
        },
        'apps': {
            'handlers': ['console', 'logfile', 'mail_admins'],
            'level': 'DEBUG',
        },
        'classes.photo': {
            'handlers': ['console', 'logfile', 'mail_admins'],
            'level': 'DEBUG',
        },
    }
}

这是我课堂的一部分:

# photo.py
import logging
logger = logging.getLogger(__name__)

class Photo:
  def create_gallery_photo(self):
    ...
    photo_size = os.path.getsize()
    if photo_size > PHOTO_SIZE_LIMIT:
        logger.error("Photo too big")

起初我只有一个“应用程序”处理程序,但我意识到错误 由于 photo.py 在“应用程序”应用程序之外,因此不会被记录。但是当我添加一个“类”记录器时,我开始收到“找不到记录器的类”错误。不知道该怎么做,我将记录器更改为“classes.photo”,“no classes”错误消失了,但仍然没有记录错误消息。我检查了“logger.name”并将其设置为“classes.photo”。因为这个错误是从课堂上记录下来的,我还需要做些什么吗?我的“应用程序”项目中的所有日志都运行良好。

【问题讨论】:

    标签: django logging


    【解决方案1】:

    尝试添加一个带有控制台处理程序的根记录器,并查看那里记录了哪些 %(name)s。所有消息都应该到达该位置,除非它们首先由具有propagate=False 的记录器处理。

    ...
    'loggers': {
        ...,
        '': {
              'handlers': ['console'],
               'level': 'DEBUG',
        },
     }
     ...
    

    【讨论】:

    • 我在上面添加了您的代码,实际上,将“classes.name”视为名称。问题是,当我使用nosetests 运行测试时,我希望看到记录的错误,但没有记录错误,即使我省略了--nologcapture 参数。当我只是执行我的代码时,错误 is 被记录下来。我不明白为什么在运行测试时没有记录错误,但只要在运行代码时记录错误,我就可以忍受。一个附带问题:看来我可以只使用 '' 作为记录器,而不是一个用于应用程序和一个用于 photo.classes,对吗?谢谢!
    • 我不熟悉鼻子测试。我知道 Django 在运行测试时设置 DEBUG=false ,当您在记录器/处理程序上有 require_debug_false 过滤器时,这将导致错误不会被记录。您可以使用根记录器来捕获两者的消息,是的。它会捕获所有没有停止传播的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多