文章目录
一、快速上手Django(四) Django 日志打
官网:https://docs.djangoproject.com/en/2.1/topics/logging/
Django 中如何优雅的记录日志
参考URL: https://zhuanlan.zhihu.com/p/133864368
Django对于日志输出的信息是很完善的,request的信息,setting配置,trackback的信息,一应俱全,足够我们调试了。但是在线上环境,如果让用户看到这些信息,是很不安全的(暴露代码)。所以在线上我们要关闭Debug,但是又不能扔掉这些调试信息,这就要用到logging模块。
logging模块其实是Python的模块,在Django中有很多本地化的支持。
在 Django 中使用 Python 的标准库 logging 模块来记录日志,关于 logging 的配置,我这里不做过多介绍,只写其中最重要的四个部分:Loggers、Handlers、Filters 和 Formatters。
1. 日志处理流程
格式器formatter,过滤器filter,处理器handler,日志实例logger。
formatter
logger ----> handler ----------------> files, emails
filter
处理流程是这样的。首先,在代码中。我们拿到的是logger实例,通过这个实例来记录信息。
# import the logging library
import logging
# Get an instance of a logger
logger = logging.getLogger('django')
def my_view(request, arg1, arg):
...
if bad_mojo:
# Log an error message
logger.error('Something went wrong!')
然后,名字是django的这个logger就会把信息交给相应的handler,handler把信息用formater和filter处理一下,提交log(保存到文件,数据库,或者发送邮件)。
2. Loggers
Logger 即记录器,是日志系统的入口。它有三个重要的工作:
向应用程序(也就是你的项目)公开几种方法,以便运行时记录消息
根据传递给 Logger 的消息的严重性,确定消息是否需要处理
将需要处理的消息传递给所有感兴趣的处理器 Handler
每一条写入 Logger 的消息都是一条日志记录,每一条日志记录都包含级别,代表对应消息的严重程度。常用的级别如下:
DEBUG:排查故障时使用的低级别系统信息,通常开发时使用
INFO:一般的系统信息,并不算问题
WARNING:描述系统发生小问题的信息,但通常不影响功能
ERROR:描述系统发生大问题的信息,可能会导致功能不正常
CRITICAL:描述系统发生严重问题的信息,应用程序有崩溃的风险
当 Logger 处理一条消息时,会将自己的日志级别和这条消息配置的级别做对比。如果消息的级别匹配或者高于 Logger 的日志级别,它就会被进一步处理,否则这条消息就会被忽略掉。
当 Logger 确定了一条消息需要处理之后,会把它传给 Handler。
3. Handlers
Handler 即处理器,它的主要功能是决定如何处理 Logger 中的每一条消息,比如把消息输出到屏幕、文件或者 Email 中。
和 Logger 一样,Handler 也有级别的概念。如果一条日志记录的级别不匹配或者低于 Handler 的日志级别,则会被 Handler 忽略。
一个 Logger 可以有多个 Handler,每一个 Handler 可以有不同的日志级别。这样就可以根据消息的重要性不同,来提供不同类型的输出。例如,你可以添加一个 Handler 把 ERROR 和 CRITICAL 消息发到你的 Email,再添加另一个 Handler 把所有的消息(包括 ERROR 和 CRITICAL 消息)保存到文件里。
4. Filters
Filter 即过滤器。在日志记录从 Logger 传到 Handler 的过程中,使用 Filter 来做额外的控制。例如,只允许某个特定来源的 ERROR 消息输出。
Filter 还被用来在日志输出之前对日志记录做修改。例如,当满足一定条件时,把日志级别从 ERROR 降到 WARNING 。
Filter 在 Logger 和 Handler 中都可以添加,多个 Filter 可以链接起来使用,来做多重过滤操作。
5. Formaters
Formatter 即格式化器,主要功能是确定最终输出的形式和内容。
二、Django日志模块logging的配置详解
Django日志模块logging的配置详解
参考URL: http://www.zzvips.com/article/105711.html
配置方式
Python中可以使用多种格式配置logging,比如.conf, .ini等。
在Django中,我们是把有关logging的配置写到settings里面。
1. 生产实战配置demo
生产实战配置settings.py 中日志配置 demo
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'verbose': {
'format': '%(asctime)s %(levelname)s %(module)s %(process)d %(thread)d %(message)s'
},
'simple': {
'format': '%(levelname)s %(message)s'
},
},
'handlers': {
'null': {
'level': 'DEBUG',
'class': 'logging.NullHandler',
},
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
'filelog': {
'level': 'INFO',
'class': 'logging.handlers.TimedRotatingFileHandler',
'formatter': 'verbose',
'filename': './webapp.log',
'when': 'midnight',
'backupCount': 5
}
},
'loggers': {
'django': {
'handlers': ['null'],
'propagate': True,
'level': 'INFO',
},
'django.request': {
'handlers': ['console', 'filelog'],
'level': 'ERROR',
'propagate': False,
},
'webapp': {
'handlers': ['console', 'filelog'],
'propagate': True,
'level': 'INFO',
}
}
}
注意: 您全局设置了 Debug为True,在这里LOGGING 中也要记得配置对应的日志等级,才能打印出对应的日志等级的日志。亲测!
留意filelog下的 filename字段,决定了日志最终写到哪个文件!
1.1 Django终端打印SQL语句
在django项目的setting.py文件中最下面,添加一下内容
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level': 'DEBUG',
},
}
}
核心就是:
‘django.db.backends’: {
‘handlers’: [‘console’,‘filelog’],
‘propagate’: True,
‘level’: ‘DEBUG’,
}