Django使用Python内建的logging模块去建造自己的系统日志的,如果你想详细了解这个模块的话,请自己去看python的说明文档,这里仅仅介绍Django中的日志系统。

日志配置包括四个部分:格式器(formatters),过滤器(filters),处理器(handlers),记录器(loggers),下面我们来一一讲解。

格式器

控制日志输出的格式,格式使用python的字符串控制格式。

属性 格式 描述
asctime %(asctime)s 日志产生的时间,默认格式为2003-07-08 16:49:45,896
created %(created)f time.time()生成的日志创建时间戳
filename %(filename)s 生成日志的程序名
funcName %(funcName)s 调用日志的函数名
levelname %(levelname)s 日志级别 ('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL')
levelno %(levelno)s 日志级别对应的数值
lineno %(lineno)d 日志所针对的代码行号(如果可用的话)
module %(module)s 生成日志的模块名
msecs %(msecs)d 日志生成时间的毫秒部分
message %(message)s 具体的日志信息
name %(name)s 日志调用者
pathname %(pathname)s 生成日志的文件的完整路径
process %(process)d 生成日志的进程ID(如果可用)
processName %(processName)s 进程名(如果可用)
thread %(thread)d 生成日志的线程ID(如果可用)
threadName %(threadName)s 线程名(如果可用)

过滤器

过滤器是用来提供额外的控制,控制哪些日志记录可以被传给处理器处理。

默认情况下,只要日志消息符合相应的等级要求就会传给对应的处理器处理,然而,通过安装过滤器,你可以在日志记录过程中设置额外的内容,例如,你可以安装一个过滤器使得某个源只有error级别的消息才会被发送。你也可以使用过滤器修改之前会被发送的消息,例如,你可以写一个过滤器使得符合某些条件的error等级的消息降级为warning等级。

过滤器可以给处理器和记录器使用,多个过滤器可以级联使用。

处理器

处理器是决定日志记录器中对应的实体消息发生了什么的引擎,描述了一个具体的日志行为,比如输出到屏幕,或者一个文件,抑或一个网络socket。

和记录器一样,没有到达相应等级的消息会被忽略。

一个记录器可以有多个处理器,一个处理器可以有不同的日志等级,因此你可以根据消息的重要性而提供不同的提示。

记录器

一个记录器是日志系统的一个实体,每一个记录器是一个已经命名好的可以将消息为进程写入的"容器"。

每一个记录器都会有一个日志等级,每个等级描述了记录器即将处理的信息的严重性,python定义了以下五个等级:

debug:出于调试目的的低层次系统信息

  • info:普通的系统信息
  • warning:描述已经发生的小问题
  • error:描述已经发生的主要问题
  • critical:描述已经发生的严重问题

每一条被写入记录器的信息成为一条日志记录,每条日志记录都有一个表明该记录严重性的日志等级,每条日志信息也会包含一些有用的元信息表明已经被记录的事件,比如栈追溯和错误代码。

当一条信息被发往记录器的时候,消息的记录等级会和记录器的等级相比较,如果符合甚至超越当前等级,则被发往处理器处理,否则会被忽略掉。

使用日志

在settings.py中配置

  1. LOGGING = {
  2. 'version': 1, # 指明dictConnfig的版本,目前就只有一个版本
  3. 'disable_existing_loggers': False, # 禁用所有的已经存在的日志配置
  4.  
  5. # 格式器
  6. 'formatters': {
  7. 'standard': { # 详细
  8. 'format': '\n时间:[%(asctime)s] | 级别:[%(levelname)s] | 路径:[%(pathname)s] | 文件名:[%(filename)s] | 方法:[%(funcName)s] | 行数:[%(lineno)d] | 日志消息:\n[%(message)s]\n\n------------------------------------------------------------',
  9. },
  10. 'simple': { # 简单
  11. 'format': '时间:%(asctime)s | %(levelname)s | %(message)s',
  12. },
  13. },
  14.  
  15. # 过滤器
  16. 'filters': {
  17. 'require_debug_true': {
  18. '()': 'django.utils.log.RequireDebugTrue',       # 此过滤器仅在settings.DEBUG为True时传递记录
  19. },
  20. 'require_debug_false': {
  21. '()': 'django.utils.log.RequireDebugFalse',      # 此过滤器仅在settings.DEBUG为False时传递记录
  22. },
  23. },
  24.  
  25. # 处理器,在这里定义了三个处理器。主要指明:处理引擎类、格式器、过滤器、日志等级
  26. 'handlers': {
  27. 'file_handler': { # 文件处理器,所有高于(包括)debug的消息会被传到"E:/Djlog/file.log"
  28. 'level':'DEBUG',
  29. 'class':'logging.handlers.TimedRotatingFileHandler',
  30. 'formatter':'standard',
  31. 'filename': 'E:/Djlog/file.log',
  32. },
  33. 'console':{ # 流处理器(控制台),所有的高于(包括)debug的消息会被传到stderr,使用的是simple格式器
  34. 'level':'INFO',
  35. 'class':'logging.StreamHandler',
  36. 'formatter': 'standard',
  37. },
  38. 'mail_admins': { # AdminEmail处理器,所有高于(包括)而error的消息会被发送给站点管理员,使用的是special格式器
  39. 'level': 'ERROR',
  40. 'class': 'django.utils.log.AdminEmailHandler',
  41. 'formatter':'standard',
  42. 'include_html':False, # 是否发送那些回溯信息,因为这些都是很敏感的系统系统,如果被人截获,可能会发生危险,所以要谨慎
  43. 'filters': ['require_debug_false'],  # 当settings.DEBUG=False的时候,AdminEmailHandler才生效
  44. },
  45. },
  46.  
  47. # 记录器。主要指明:处理器、日志等级
  48. 'loggers': {
  49. 'django': { # 使用file_handler处理器,所有高于(包括)info的消息会被发往console和file_handler处理器,向父层次传递信息
  50. 'handlers': ['file_handler','console'],
  51. 'level':'INFO',
  52. 'propagate': False, # 是否继承父类的log信息
  53. },
  54. 'django.request': { # 所有高于(包括)error的消息会被发往console和mail_admins处理器,消息不向父层次发送
  55. 'handlers': ['mail_admins','console'],
  56. 'level': 'DEBUG',
  57. 'propagate': False,
  58. },
  59. 'myproject.custom': { # 所有高于(包括)info的消息同时会被发往console和mail_admins处理器
  60. 'handlers': ['mail_admins','console'],
  61. 'level': 'INFO',
  62. 'propagate': False,
  63. },
  64. }
  65. }

程序中

配置格式器,过滤器,处理器和记录器后,需要将日志记录调用放入代码中。使用日志框架非常简单,这是一个例子:

  1. # import the logging library
  2. import logging
  3.  
  4. # Get an instance of a logger
  5. logger = logging.getLogger(__name__)      # 获得实例对象。__name__模块名,可以传入其他
  6.  
  7. def my_view(request, arg1, arg):
  8. ...
  9. if bad_mojo:
  10. # Log an error message
  11. logger.error('Something went wrong!')

禁用日志配置

LOGGING_CONFIG=None,禁用。

Django自带的记录器

django记录器

django记录器是捕捉所有消息的记录器,没有消息是直接发往django记录器的,而是使用下面的记录器。

django.request记录器

5XX会引发一个error消息,4XX会引发一个warning消息,这个记录器还附带有额外的上下文:

  • status_code:HTTP响应吗
  • request:生成这个消息的request对象

django.db.backends记录器

所有的由请求运行的sql语句都会记录一条debug的消息,每个记录器还附带有额外的上下文:

  • duration:sql语句运行的时间
  • sql:运行的sql语句
  • params:sql语句调用的参数

处于网站运行的表现原因,仅当settings.DEBUG=True的时候,这个处理器才生效,否则即使配置了也无效。

Django自带的过滤器

class CallBackFilter(callback)

这个过滤器接受一个回调函数(这个函数接受一个参数,被记录的信息),每个记录通过过滤器的时候都会调用这个回调函数,当回调函数返回False的时候,不处理这个记录。下面是一个示例:

  1. from django.http import UnreadablePostError
  2.  
  3. def skip_unreadable_post(record):
  4. if record.exc_info:
  5. exc_type, exc_value = record.exc_info[:2]
  6. if isinstance(exc_value, UnreadablePostError):
  7. return False
  8. return True
  1. 'filters': {
  2. 'skip_unreadable_posts': {
  3. '()': 'django.utils.log.CallbackFilter',
  4. 'callback': skip_unreadable_post,
  5. }
  6. },
  7. 'handlers': {
  8. 'mail_admins': {
  9. 'level': 'ERROR',
  10. 'filters': ['skip_unreadable_posts'],
  11. 'class': 'django.utils.log.AdminEmailHandler'
  12. }
  13. },

class RequireDebugFalse

此过滤器仅在settings.DEBUG为False时传递记录。

class RequireDebugTrue

此过滤器仅当settings.DEBUG为True时传递记录。

  至此,转载请注明出处。

本站相关链接:>>Django部署 ]

Django 系统日志logging的更多相关文章

  1. django 日志logging的配置以及处理

    django日志官方文档https://docs.djangoproject.com/en/1.11/topics/logging/ 本文摘自http://davidbj.blog.51cto.com ...

  2. [转]django 日志logging的配置以及处理

    http://davidbj.blog.51cto.com/4159484/1433741 日志在程序开发中是少不了的,通过日志我们可以分析到错误在什么地方,有什么异常.在生产环境下有很大的用途.在J ...

  3. django使用logging记录日志

    django使用logging记录日志,我没有用这方式去记录日志,主要还是项目小的原因吧, 有机会遇见大项目的话可以回头研究. 配置setting.py配置文件 import logging impo ...

  4. Django框架----logging配置

    我写Django项目常用的logging配置.(追加在setting.py文件中) LOGGING = { 'version': 1, 'disable_existing_loggers': Fals ...

  5. Django之logging日志使用

    Logger模块 是python中用于便捷记录日志且线程安全的模块 使用logging模块记录日志涉及四个主要类: logger提供了应用程序可以直接使用的接口: handler将(logger创建的 ...

  6. Django之logging日志

    简介 Django使用python自带的logging 作为日志打印工具.简单介绍下logging. logging 是线程安全的,其主要由4部分组成: Logger 用户使用的直接接口,将日志传递给 ...

  7. Django 之 logging

    1. logging 1.1 什么是 logging logging 模块是 Python 内置的日志管理模块,不需要额外安装. 使用: import logging logging.critical ...

  8. Django之logging配置

    1. settings.py文件 做开发离不开必定离不开日志, 以下是我在工作中写Django项目常用的logging配置. # 日志配置 BASE_LOG_DIR = os.path.join(BA ...

  9. Django 的 logging日志文件配置

    在Django的settings配置文件里配置以下信息: import os BASE_LOG_DIR = os.path.join(BASE_DIR , "log") # log ...

随机推荐

  1. Java集合及concurrent并发包总结(转)

    Java集合及concurrent并发包总结(转)   1.集合包 集合包最常用的有Collection和Map两个接口的实现类,Colleciton用于存放多个单对象,Map用于存放Key-Valu ...

  2. Springboot 启动详解

    1.前言 最近一直在看Springboot和springcloud代码,看了将近20多天,对这两个系统的认知总算是入了门.后续应该会有一个系列的文章,本文就先从Springboot的启动入手. 2.容 ...

  3. 【转】vmware 安装 osx 无法登录 appstore 的解决办法 (伪造smbios设备信息)

    伪造smbios设备信息 原文网址:http://www.insanelymac.com/forum/topic/292170-how-to-spoof-real-mac-in-vmware/page ...

  4. 禁用feign retryer

    为什么要禁用retryer?其实主要是为了Debug,禁用feign retryer有两面性,如果接口做好幂等性,retry不影响,但是总有一些意外发生,比如:有一个实例发生了故障而该情况还没有被服务 ...

  5. 创业公司都在使用的3款Python库

    Instavest上发表了一篇博文,文章分享了深受创业公司喜爱的3款Python库,该文章在Hacker News上引发了开发者的激烈探讨,如果你也对此感兴趣,不妨移步去看下.笔者将该文简译过来以分享 ...

  6. 自定义Appium

    改造appium-android-driver 这个driver是UIAutomator1的driver,负责UIAutomator1的服务启动.停止.命令接收和执行. 工程结构 appium-and ...

  7. vue开发中,build时css打包报错

    vue在打包的时候css报错,首先声明的这个并没有解决webpack本身的问题,本来这个也是一个警示,不会影响代码正常运行 这个是因为我在多个页面引入了同一个css文件,webpack打包时候对css ...

  8. shell脚本示例:批量比较多个文件的内容是否相同

    bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 要比较两个文件的内容是否完全一致,可以简单地使用diff命令. ...

  9. js_ajax模拟form表单提交_多文件上传_支持单个删除

    需求场景: 用一个input type="file"按钮上传多张图片,可多次上传,可单独删除,最后使用ajax模拟form表单提交功能提交到指定方法中: 问题:由于只有一个file ...

  10. [心得] 如何利用liquibase進行資料庫版本控制 - 基礎觀念

    前言 - 會寫這篇除了是要記錄一下使用的過程之外,也是發現到網路上找來的教學幾乎都是跟其它環境做結合 比較沒有單純利用command進行的流程.也沒有整體觀念的介紹,所以將我所理解的整理分享給大家. ...