【问题标题】:Django LOGGING not printing to console and fileDjango LOGGING 不打印到控制台和文件
【发布时间】:2020-07-05 19:46:15
【问题描述】:

我遇到了 Django Loggers 的奇怪行为。

我正在使用 Django 开发前端应用程序。在登录服务期间,我向某些组件发出一些请求,并使用 log.warning() 调用来查看请求的流程。

日志运行良好,直到我决定添加一个 LOGGING 配置以在文件中打印日志的输出,因为我想通过 Docker 部署应用程序并且我想定期检查日志文件。

当我添加以下有关日志记录的 Django 配置时:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
        'detailed': {
            'class': 'logging.Formatter',
            'format': "[%(asctime)s] - [%(name)s:%(lineno)s] - [%(levelname)s] %(message)s",
        }
    },
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'level': 'INFO',
            'formatter': 'detailed',
        },
        'file': {
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': "{}/am.log".format(BASE_DIR),
            'mode': 'w',
            'formatter': 'detailed',
            'level': 'INFO',
            'maxBytes': 2024 * 2024,
            'backupCount': 5,
        },
    },
    'loggers': {
        'am': {
            'level': 'INFO',
            'handlers': ['console', 'file']
        },
    }
}

日志记录停止工作。日志配置中指定的文件 am.log 确实已创建,但没有任何内容打印到该文件。甚至控制台日志记录也不会发生。

我已经从我的一个 Django 项目中为这个应用程序的后端获取了这个日志记录配置,它在那里完美运行。我真的不明白我做错了什么。您能否帮助我或指导我正确的方向。我会很感激。

祝大家有个美好的一天!

【问题讨论】:

  • “am”是您应用的名称吗?每个记录器的键应该是生成记录的模块的名称(假设您使用logger = logging.getLogger('__name__') 获取记录器),否则它应该是记录器的名称,即logger = logging.getLogger('am')。如果您想要所有内容,请使用根记录器,即密钥应该是空字符串 ('')。

标签: django logging django-rest-framework


【解决方案1】:

通过在'loggers' 配置中使用键“am”,您定义了一个名为“am”的记录器:

'loggers': {
        'am': {   #  <-- name of the logger
            'level': 'INFO',
            'handlers': ['console', 'file']
        },
    }

因此,要使用该记录器,您必须使用该名称来获取它:

logger = logging.getLogger("am")
logger.warning("This is a warning")

如果您使用正在运行的模块的名称来命名记录器(这是推荐做法),那么您需要定义每个模块记录器:

logger = logging.getLogger(__name__)  # <-- this logger will be named after the module, e.g. your app name.

然后在您的日志记录配置中,您可以指定每个模块(每个应用程序)的日志记录行为:

'loggers': {
        'my_app': {  # <-- logging for my app
            'level': 'INFO',
            'handlers': ['console', 'file']
        },
        'django': {   # <-- logging for Django module
            'level': 'WARNING',
            'handlers': ['console', 'file']
        },
    }

或者,如果您只想记录所有内容,请使用根 ('') 记录器,它没有名称,只是空字符串:

'loggers': {
        '': {   # <-- root logger
            'level': 'INFO',
            'handlers': ['console', 'file']
        },
    }

【讨论】:

  • 非常感谢德克。我完全忘记了这方面。以后我会多加注意的。祝福!
猜你喜欢
  • 1970-01-01
  • 2016-04-28
  • 1970-01-01
  • 1970-01-01
  • 2021-06-05
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
  • 2018-11-28
相关资源
最近更新 更多