Django使用Python内置的logging模块实现它自己的日志系统。

如果你没有使用过logging模块,请参考Python教程中的相关章节。

直达链接《logging模块详解》。

在Python的logging模块中,主要包含下面四大金刚:

Loggers: 记录器
Handlers:处理器
Filters: 过滤器
Formatters: 格式化器

下文假定你已经对logging模块有一定的了解。否则,可能真的像看天书......

一、在Django视图中使用logging

使用方法非常简单,如下例所示:

导入logging库

import logging

获取一个logger对象

logger = logging.getLogger(name)

def my_view(request, arg1, arg):

...

if bad_mojo:

# 记录一个错误日志

logger.error('Something went wrong!')

每满足bad_mojo条件一次,就写入一条错误日志。

实际上,logger对象有下面几个常用内置方法:

logger.debug()
logger.info()
logger.warning()
logger.error()
logger.critical()

二、在Django中配置logging

通常,只是像上面的例子那样简单的使用logging模块是远远不够的,我们一般都要对logging的四大金刚进行一定的配置。

Python的logging模块提供了好几种配置方式。默认情况下,Django使用dictConfig format。也就是字典方式。

例一:

LOGGING = {

'version': 1,

'disable_existing_loggers': False,

'handlers': {

'file': {

'level': 'DEBUG',

'class': 'logging.FileHandler',

'filename': '/path/to/django/debug.log',

},

},

'loggers': {

'django': {

'handlers': ['file'],

'level': 'DEBUG',

'propagate': True,

},

},

}

如果你使用上面的样例,请确保Django用户对'filename'对应目录和文件的写入权限。

例二:

下面这个示例配置,让Django将日志打印到控制台,通常用做开发期间的信息展示。

import os

LOGGING = {

'version': 1,

'disable_existing_loggers': False,

'handlers': {

'console': {

'class': 'logging.StreamHandler',

},

},

'loggers': {

'django': {

'handlers': ['console'],

'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'),

},

},

}

例三:

下面是一个相当复杂的logging配置:

LOGGING = {

'version': 1,

'disable_existing_loggers': False,

'formatters': {

'verbose': {

'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'

},

'simple': {

'format': '%(levelname)s %(message)s'

},

},

'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.custom': {

'handlers': ['console', 'mail_admins'],

'level': 'INFO',

'filters': ['special']

}

}

}

上面的logging配置主要定义了这么几件事情:

定义了配置文件的版本,当前版本号为1.0

定义了两个formatter:simple和format,分别表示两种文本格式。

定义了两个过滤器:SpecialFilter和RequireDebugTrue
定义了两个处理器:console和mail_admins
配置了三个logger:'django'、'django.request'和'myproject.custom'

三、Django对logging模块的扩展

Django对logging模块进行了一定的扩展,用来满足Web服务器专门的日志记录需求。

  1. 记录器 Loggers

Django额外提供了几个其内建的logger。

django: 不要使用这个记录器,用下面的。这是一个被供起来的记录器,^-^
django.request: 记录与处理请求相关的消息。5XX错误被记录为ERROR消息;4XX错误记录为WARNING消息。接收额外参数:status_code和request
django.server: 记录开发服务器下处理请求相关的消息。只用于开发阶段。
django.template: 记录与渲染模板相关的日志。
django.db.backends: 与数据库交互的代码相关的消息。
django.security: 记录任何与安全相关的错误。
django.security.csrf: 记录CSRF验证失败日志。
django.db.backends.schema: 记录查询导致数据库修改的日志。
  1. 处理器 Handlers

Django额外提供了一个handler,AdminEmailHandler。这个处理器将它收到的每个日志信息用邮件发送给站点管理员。

3. 过滤器Filters

Django还额外提供两个过滤器。

CallbackFilter(callback)[source]:这个过滤器接受一个回调函数,并对每个传递给过滤器的记录调用它。如果回调函数返回False,将不会进行记录的处理。

RequireDebugFalse[source]: 这个过滤器只会在settings.DEBUG==False时传递。

四、总结

总体而言,在Django中使用logging和在普通Python程序中,区别不大。

第六章:Django 综合篇 - 14:Django 日志的更多相关文章

  1. 第六章·Logstash深入-收集java日志

    1.通过Logstash收集java日志并输出到ES中 因为我们现在需要用Logstash收集tomcat日志,所以我们暂时将tomcat安装到Logstash所在机器,也就是db03:10.0.0. ...

  2. 第六章:Django 综合篇 - 2:核心配置项

    Django的默认配置文件中,包含上百条配置项目,其中很多是我们'一辈子'都不碰到或者不需要单独配置的,这些项目在需要的时候再去查手册. 强调:配置的默认值不是在settings.py文件中!不要以为 ...

  3. 第六章:Django 综合篇

    前面五章,已经将Django最主要的五大系统介绍完毕,除了这些主要章节,还有很多比较重要的内容,比如开发流程相关.安全.本地化与国际化.常见工具和一些框架核心功能.这些内容的篇幅都不大,但整合起来也是 ...

  4. 第六章:Django 综合篇 - 1:配置 Django

    Django项目的设置文件位于项目同名目录下,名叫settings.py.这个模块,集合了整个项目方方面面的设置属性,是项目启动和提供服务的根本保证. 一.简述 settings.py文件本质上是一个 ...

  5. 第六章:Django 综合篇 - 8:信号 signal

    django自带一套信号机制来帮助我们在框架的不同位置之间传递信息.也就是说,当某一事件发生时,信号系统可以允许一个或多个发送者(senders)将通知或信号(signals)发送给一组接受者(rec ...

  6. 《Django By Example》第六章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:无他,祝大家年会都中奖!) 第六章 ...

  7. The Django Book第六章(Admin)随笔

    要使用Django自带的管理界面,首先得激活- 激活的前提首先在你的项目的seeting目录下的INSTALL_APPS必须有以下的的包 django.contrib.admin django.con ...

  8. Django应用:学习日志网站

    目录 一.创建虚拟环境(Windows) 二.创建项目 三.创建应用程序 四.创建网页:学习笔记主页 五.创建其他网页 六.用户输入数据 七.用户账户 八.让用户拥有自己的数据 九.设置应用程序样式 ...

  9. django+nginx+xshell简易日志查询,接上<关于《rsyslog+mysql+loganalyzer搭建日志服务器<个人笔记>》的反思>

    纠正一下之前在<关于<rsyslog+mysql+loganalyzer搭建日志服务器<个人笔记>>的反思>中说到的PHP+MySQL太慢,这里只是说我技术不好,没 ...

随机推荐

  1. Codeforces Round #780 (Div. 3)

    A. Vasya and Coins 题目链接 题目大意 Vasya 有 a 个 1-burle coin,有 b 个 2-burle coin,问他不能通过不找钱支付的价格的最小值. 思路 如果 a ...

  2. 新版recon-ng安装模块

    表现:进入后报[*] No modules enabled/installed. 1.直接在recon-ng控制台输入marketplace install all,用来下载所有插件,如果不可以,往下 ...

  3. 快来体验快速通道,netty中epoll传输协议详解

    目录 简介 epoll的详细使用 EpollEventLoopGroup EpollEventLoop EpollServerSocketChannel EpollSocketChannel 总结 简 ...

  4. 【摸鱼神器】UI库秒变低代码工具——表单篇(二)子控件

    上一篇介绍了表单控件,这一篇介绍一下表单里面的各种子控件的封装方式. 主要内容 需求分析 子控件的分类 子控件属性的分类 定义 interface. 定义子控件的的 props. 定义 json 文件 ...

  5. 面试官:你确定 Redis 是单线程的进程吗?

    作者:小林coding 计算机八股文网站:https://xiaolincoding.com 大家好,我是小林. 这次主要分享 Redis 线程模型篇的面试题. Redis 是单线程吗? Redis ...

  6. SkyWalking分布式系统应用程序性能监控工具-上

    概述 微服务系统监控三要素 现在系统基本都是微服务架构,对于复杂微服务链路调用如下问题如何解决? 一个请求经过了这些服务后其中出现了一个调用失败的问题,如何定位问题发生的地方? 如何计算每个节点访问流 ...

  7. 多态的好处和instanceof关键字

    多态的好处: 可替换性:多态对已经存在的代码具有可替换性 可扩展性:多态对待吗具有可扩展性,增加新的子类不影响已经存在类的多态性,继承性,以及其他特征的运行和操作.实际上新家子类更容易获得多态功能 接 ...

  8. linux文件校验

    最近在一次安装centos7程序中遇到了网速很卡的情况,不得已采用了百度云的离线下载功能,后来上传进入虚拟机内,结果遇到无法上传的情况,后来经过转码后才上传成功,详情http://www.cnblog ...

  9. SQL 字符串去除空格函数汇总

    SQL 中使用ltrim()去除左边空格 ,rtrim()去除右边空格 ,没有同时去除左右空格的函数,要去除所有空格可以用replace(字符串,' ',''),将字符串里的空格替换为空 . 例:去除 ...

  10. 蔚来杯2022牛客暑期多校训练营5 ABCDFGHK

    比赛链接 A 题解 知识点:图论,dp. 暴力建图,连接所有点的双向通路,除了原点是单向的,并且把路径长度作为权值. 随后,从原点出发(\(f[0] = 0\),其他点负无穷,保证从原点出发),按照权 ...