A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈泽 中级黑马   /  2019-7-10 09:20  /  1170 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陈泽 于 2019-7-10 09:32 编辑

日志框架的组成元素
[Python] 纯文本查看 复制代码
logger: 日志系统的入口,可以配置 日志级别
Handlers
过滤器
Formatters

1.Loggers

logger是日志的系统的入口,可以配置日志级别(日志级别:描述该logger处理的消息的严重性)

​        日志级别:

[Python] 纯文本查看 复制代码
1.DEBUG:排查故障时使用的低级别系统信息
2.INFO:一般的系统信息
3.WARNING:描述系统发生了一些小问题的信息
4.ERROR:描述系统发生了大问题的信息
5.CRITICAL:描述系统发生严重问题的信息

每一条写入 logger 的消息都是一条日志记录。每一条日志记录也包含日志级别,代表对应消息的严重程度。

当 logger 处理一条消息时,会将自己的日志级别和这条消息的日志级别做对比。如果消息的日志级别匹配或者高于 logger 的日志级别,它就会被进一步处理。否则这条消息就会被忽略掉。

当 logger 确定了一条消息需要处理之后,会把它传给 Handler

2.Handlers

Handlers是决定如何处理logger中每一条消息的引擎。它描述特定的日志行为,比如把消息输出到屏幕、文件或网络 socket。

handler 也有日志级别的概念。如果一条日志记录的级别不匹配或者低于 handler 的日志级别,对应的消息会被 handler 忽略。

一个 logger 可以有多个 handler,每一个 handler 可以有不同的日志级别。这样就可以根据消息的重要性不同,来提供不同格式的输出

3.过滤器

在日志记录从 logger 传到 handler 的过程中,使用 Filter 来做额外的控制。

默认情况下,只要级别匹配,任何日志消息都会被处理。不过,也可以通过添加 filter 来给日志处理的过程增加额外条件。例如,可以添加一个 filter 只允许某个特定来源的 ERROR 消息输出。

Filter 还被用来在日志输出之前对日志记录做修改。例如,可以写一个 filter,当满足一定条件时,把日志记录从 ERROR 降到 WARNING 级别。

Filter 在 logger 和 handler 中都可以添加;多个 filter 可以链接起来使用,来做多重过滤操作。

4.Formatters

日志记录最终是需要以文本来呈现的。Formatter 描述了文本的格式。一个 formatter 通常由包含 :ref:](https://docs.djangoproject.com/zh-hans/2.1/topics/logging/#id1)LogRecord attributes [python:logrecord-attributes 的 Python 格式化字符串组成,不过你也可以为特定的格式来配置自定义的 formatter。

模块日志的配置

1.disable_existing_loggers

默认就是Ture,那么默认配置中的logger全部被禁用。被禁用的logger并不是被删除了,它们仍然存在,只是静默地丢弃所有发来的日志请求,甚至不会传播给上级logger


[Python] 纯文本查看 复制代码
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': { # 日志信息显示的格式
        'verbose': {
            'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',
            'style': '{',
        },
        'simple': {
            'format': '{levelname} {message}',
            'style': '{',
        },
    },
    'filters': {
        'special': {
            '()': 'project.logging.SpecialFilter',
            'foo': 'bar',
        },
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',# django在debug模式下才输出日志
        },
    },
    'handlers': {
        'console': {
            'level': 'INFO',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'mail_admins': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler',
            'filters': ['special']
        }
    },
    'loggers': {
        'django': {
            'handlers': ['console'],
            'propagate': True,#是否继续传递日志信息
        },
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': False,
        },
        'myproject.custom': {
            'handlers': ['console', 'mail_admins'],
            'level': 'INFO',
            'filters': ['special']
        }
    }
}

此日志记录配置执行以下操作:
将配置标识为“dictConfig版本1”格式。目前,这是唯一的dictConfig格式版本。
定义两个格式化程序:
    simple,只输出日志级别名称(例如 DEBUG)和日志消息。
       该format字符串是一个普通的Python格式化字符串,用于描述要在每个日志记录行上输出的详细信息。可以输出的完整详细列表可以在Formatter Objects中找到。
    verbose,输出日志级别名称,日志消息,以及生成日志消息的时间,进程,线程和模块。

定义两个过滤器:
    project.logging.SpecialFilter,使用别名special。如果此过滤器需要其他参数,则可以在过滤器配置字典中将它们作为附加键提供。在这种情况下,参数 foo将被赋予bar实例化时 的值SpecialFilter。
    django.utils.log.RequireDebugTrue,其传递记录时 DEBUG是True。

定义两个处理程序:
    console,a StreamHandler,打印任何INFO (或更高)消息sys.stderr。此处理程序使用simple输出格式。
    mail_admins,an AdminEmailHandler,将任何ERROR (或更高)消息通过电子邮件发送到网站ADMINS。此处理程序使用 special过滤器。
配置三个记录器:
    django,将所有消息传递给console处理程序。
    django.request,将所有ERROR消息传递给mail_admins处理程序。此外,此记录器标记为不传播消息。这意味着写入的日志消息django.request将不会被django记录器处理。
    myproject.custom,它传递所有INFO 或更高的消息,也将special过滤器传递给两个处理程序 - console,和mail_admins。这意味着所有INFO级别的消息(或更高级别)将被打印到控制台; ERROR和CRITICAL 消息也将通过电子邮件输出。







0 个回复

您需要登录后才可以回帖 登录 | 加入黑马