日志记录

总览

Django利用并扩展了Python自带的logging模块,并以此来进行系统日志记录。

不同的角色

Python 日志配置由四个部分组成:

  • Loggers
  • Handlers
  • Filters
  • Formatters

Loggers

一个logger是日志系统的入口。每个logger都是一个命名的存储块,处理消息的存储。
一个logger配置一个日志等级。这个等级描述了该logger处理的信息安全等级。

  • DEBUG: debug目的的低等级系统信息
  • INFO: 一般系统信息
  • WARNING: 次严重发生的问题
  • ERROR: 主要严重发生的问题
  • CRITICAL: 非常严重发生的问题

每个写入logger的信息都是一个Log Record。每个日志记录也具有一个日志等级来表示信息的安全等级。一个日志记录也包含一些描述记录的事件。通常也好办一个堆栈追踪或一个错误代码。
当信息到达logger时,信息的等级会与logger的等级比较,只有信息等级≥logger信息等级时,信息才会被进一步处理,否则信息会被忽略。
一旦logger认为一条信息需要被处理时,这个信息就会交给handler处理。

Handlers

handler决定了在logger内部如何处理信息。它用来描述特定的日志记录行为,例如将信息输出到屏幕,文件或网络socket。

和logger类似,handler也具有日志等级。如果日志记录的等级大于handler的日志等级,handler将不会处理这条日志信息。

一个logger具有多个handler,每个handler具有不同的日志等级。这样就可以针对不同的日志等级,予以不同的处理方式。

Filters

filter用来进一步控制哪些信息可以从logger传递给handler。

默认情况下,任何满足日志等级要求的信息都会被处理。但是,添加filter之后,可以添加额外的限制。例如,添加一个filter,用来限制只有来自特定资源的ERROR等级信息被处理。

filter可以在处理日志信息之前,处理日志日志记录。例如,可以添加一个满足一定条件时,将日志等级从ERROR降低为WARNING

filter可以安装在logger上,也可以安装在handler上。filter可以链式使用。

Formatters

最终一个日志记录,将以文本信息表示。Formatter描述了文本的具体形式。
formatter通常由一个Python包含LogRecord属性的文本字符串表示。同样,也可以编写继承了特定格式化行为的自定义formatter。

安全影响

日志系统处理潜在敏感信息。例如,日志记录可能包含web请求或堆栈追踪信息,同样自定义logger中收集的信息也可能具有一些安全影响。需要明确的知道如下信息:

  • 收集什么信息
  • 在哪里存储信息
  • 信息如何转换
  • 谁将获取这些信息

为了帮助控制敏感信息集合,可以明确哪些敏感信息在错误报告中过滤掉。

AdminEmailHandler

内置的AdminEmailHandler需要提一下。如果include_html选项被启用,邮件信息将包含完整的追踪信息,同时包括本地变量的名字和值,如果配置中DEBUG设置为True,则Django的配置也会被输出。

通常不建议通过邮件来发送这种敏感信息。应考虑使用第三方服务工具进行管理。

Django日志配置

  • LOGGING_CONFIG: 设定解析日志配置方式,其值为一个以LOGGING为形参的可调用对象。设置为None时,可以阻止Django默认的logging配置。设为None后,Django依旧会发送logging请求,并走向自定义日志配置。
LOGGING_CONFIG = None

import logging.config

logging.config.dictConfig(...)

  • LOGGING: 日志详细配置
    • version: 设置版本
    • disable_existing_logger: 推荐设置为False,关闭默认logger
    • formatters:配置格式化器
      • 值为多个键值对,定义多个formatter
      • format:定义格式化时显示的内容
      • style:格式的表示符
    • filters:配置过滤器
      • 值为多个键值对,定义多个filter
      • (): 配置过滤器名称
      • 形参名: 配置过滤器名称中使用形参的实参值
    • handlers:配置处理器
      • 值为多个键值对,定义多个handler
      • level: 配置其处理的日志等级
      • class:配置日志处理可回调对象名
      • 形参名:配置class中可回调对象的形参的实参值
      • formatter: 配置格式化器的键名
      • filters: 配置过滤器列表,值为过滤器的键名
    • loggers:配置日志管理器
      • 值为多个键值对,定义多个logger
      • handlers: 配置处理器列表,值为处理器的键名
      • level:配置日志等级
      • filters:配置过滤器列表,值为过滤器的键名
      • propagate: 配置是否传播,True时表示传播至其他logger,False时表示不传播

# setting.py
LOGGING_CONFIG = "logging.config.dictConfig"

LOGGING = {
    "version":1,
    "disable_existing_logger": 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"
        }
    },
    "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.customer":{
            "handlers":["console", "mail_admins"],
            "level":"INFO",
            "filters":["special"]
        }
    }
}



posted @ 2024-06-21 11:06  Python习者  阅读(7)  评论(0)    收藏  举报