Django 系统日志logging
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中配置
LOGGING = {
'version': 1, # 指明dictConnfig的版本,目前就只有一个版本
'disable_existing_loggers': False, # 禁用所有的已经存在的日志配置
# 格式器
'formatters': {
'standard': { # 详细
'format': '\n时间:[%(asctime)s] | 级别:[%(levelname)s] | 路径:[%(pathname)s] | 文件名:[%(filename)s] | 方法:[%(funcName)s] | 行数:[%(lineno)d] | 日志消息:\n[%(message)s]\n\n------------------------------------------------------------',
},
'simple': { # 简单
'format': '时间:%(asctime)s | %(levelname)s | %(message)s',
},
},
# 过滤器
'filters': {
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue', # 此过滤器仅在settings.DEBUG为True时传递记录
},
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse', # 此过滤器仅在settings.DEBUG为False时传递记录
},
},
# 处理器,在这里定义了三个处理器。主要指明:处理引擎类、格式器、过滤器、日志等级
'handlers': {
'file_handler': { # 文件处理器,所有高于(包括)debug的消息会被传到"E:/Djlog/file.log"
'level':'DEBUG',
'class':'logging.handlers.TimedRotatingFileHandler',
'formatter':'standard',
'filename': 'E:/Djlog/file.log',
},
'console':{ # 流处理器(控制台),所有的高于(包括)debug的消息会被传到stderr,使用的是simple格式器
'level':'INFO',
'class':'logging.StreamHandler',
'formatter': 'standard',
},
'mail_admins': { # AdminEmail处理器,所有高于(包括)而error的消息会被发送给站点管理员,使用的是special格式器
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
'formatter':'standard',
'include_html':False, # 是否发送那些回溯信息,因为这些都是很敏感的系统系统,如果被人截获,可能会发生危险,所以要谨慎
'filters': ['require_debug_false'], # 当settings.DEBUG=False的时候,AdminEmailHandler才生效
},
},
# 记录器。主要指明:处理器、日志等级
'loggers': {
'django': { # 使用file_handler处理器,所有高于(包括)info的消息会被发往console和file_handler处理器,向父层次传递信息
'handlers': ['file_handler','console'],
'level':'INFO',
'propagate': False, # 是否继承父类的log信息
},
'django.request': { # 所有高于(包括)error的消息会被发往console和mail_admins处理器,消息不向父层次发送
'handlers': ['mail_admins','console'],
'level': 'DEBUG',
'propagate': False,
},
'myproject.custom': { # 所有高于(包括)info的消息同时会被发往console和mail_admins处理器
'handlers': ['mail_admins','console'],
'level': 'INFO',
'propagate': False,
},
}
}
程序中
配置格式器,过滤器,处理器和记录器后,需要将日志记录调用放入代码中。使用日志框架非常简单,这是一个例子:
# import the logging library
import logging # Get an instance of a logger
logger = logging.getLogger(__name__) # 获得实例对象。__name__模块名,可以传入其他 def my_view(request, arg1, arg):
...
if bad_mojo:
# Log an error message
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的时候,不处理这个记录。下面是一个示例:
from django.http import UnreadablePostError def skip_unreadable_post(record):
if record.exc_info:
exc_type, exc_value = record.exc_info[:2]
if isinstance(exc_value, UnreadablePostError):
return False
return True
'filters': {
'skip_unreadable_posts': {
'()': 'django.utils.log.CallbackFilter',
'callback': skip_unreadable_post,
}
},
'handlers': {
'mail_admins': {
'level': 'ERROR',
'filters': ['skip_unreadable_posts'],
'class': 'django.utils.log.AdminEmailHandler'
}
},
class RequireDebugFalse
此过滤器仅在settings.DEBUG为False时传递记录。
class RequireDebugTrue
此过滤器仅当settings.DEBUG为True时传递记录。
至此,转载请注明出处。
[ 本站相关链接:>>Django部署 ]

Django 系统日志logging的更多相关文章
- django 日志logging的配置以及处理
django日志官方文档https://docs.djangoproject.com/en/1.11/topics/logging/ 本文摘自http://davidbj.blog.51cto.com ...
- [转]django 日志logging的配置以及处理
http://davidbj.blog.51cto.com/4159484/1433741 日志在程序开发中是少不了的,通过日志我们可以分析到错误在什么地方,有什么异常.在生产环境下有很大的用途.在J ...
- django使用logging记录日志
django使用logging记录日志,我没有用这方式去记录日志,主要还是项目小的原因吧, 有机会遇见大项目的话可以回头研究. 配置setting.py配置文件 import logging impo ...
- Django框架----logging配置
我写Django项目常用的logging配置.(追加在setting.py文件中) LOGGING = { 'version': 1, 'disable_existing_loggers': Fals ...
- Django之logging日志使用
Logger模块 是python中用于便捷记录日志且线程安全的模块 使用logging模块记录日志涉及四个主要类: logger提供了应用程序可以直接使用的接口: handler将(logger创建的 ...
- Django之logging日志
简介 Django使用python自带的logging 作为日志打印工具.简单介绍下logging. logging 是线程安全的,其主要由4部分组成: Logger 用户使用的直接接口,将日志传递给 ...
- Django 之 logging
1. logging 1.1 什么是 logging logging 模块是 Python 内置的日志管理模块,不需要额外安装. 使用: import logging logging.critical ...
- Django之logging配置
1. settings.py文件 做开发离不开必定离不开日志, 以下是我在工作中写Django项目常用的logging配置. # 日志配置 BASE_LOG_DIR = os.path.join(BA ...
- Django 的 logging日志文件配置
在Django的settings配置文件里配置以下信息: import os BASE_LOG_DIR = os.path.join(BASE_DIR , "log") # log ...
随机推荐
- 原生js ajax请求
什么是ajax AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新. 这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新, ...
- Java虚拟机监控命令
熟悉java的人都知道jdk的bin目录中有很多小工具,其中就包括用于监视虚拟机和故障处理的工具,今天就来仔细了解下各个工具的用法 jps JVM Process Status Tool,用于显示指定 ...
- Android UI(四)云通讯录项目之云端更新进度条实现
作者:泥沙砖瓦浆木匠网站:http://blog.csdn.net/jeffli1993个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节.交流QQ群:[编程之美 365234583]h ...
- Apache-Flink深度解析-DataStream-Connectors之Kafka
Kafka 简介 Apache Kafka是一个分布式发布-订阅消息传递系统. 它最初由LinkedIn公司开发,LinkedIn于2010年贡献给了Apache基金会并成为顶级开源项目.Kafka用 ...
- Netty源码分析(五):EventLoop
上一篇主要介绍了一下EventLoopGroup,本篇详细看下它的成员EventLoop. 类结构 NioEventLoop继承自SingleThreadEventLoop,而SingleThread ...
- java web路径和spring读取配置文件
此篇博客缘起:部署java web系统到阿里云服务器(ubuntu14.04)的时候,有以下两个问题 找不到自定义的property配置文件 上传图片的时候找不到路径 开发的时候是在windows上的 ...
- spring boot多数据源配置(mysql,redis,mongodb)实战
使用Spring Boot Starter提升效率 虽然不同的starter实现起来各有差异,但是他们基本上都会使用到两个相同的内容:ConfigurationProperties和AutoConfi ...
- 痞子衡嵌入式:恩智浦LPC系列MCU开发那些事 - 索引
大家好,我是痞子衡,是正经搞技术的痞子.本系列痞子衡给大家介绍的是恩智浦LPC系列微控制器相关知识. 恩智浦半导体最早于2003年便开始推出LPC系列MCU,但早期的产品LPC2000/3000系列属 ...
- 【前端框架系列】浅谈当前基于bootstrap框架的几种主流前端框架
一 概述 当新开发一个项目或产品时,技术选型是一个不可缺少的环节,在软件架构中有着举足轻重的作用,可以这么说,技术选型的好坏直接影响项目或产品的成败优劣,因此,在进行软件架构时,一定要想好技术选型. ...
- Java——类和对象
前言 Java语言是一种面向对象的语言.面向对象的思想是在七十年代的时候由IBM的SmallTalk语言最先推广.那什么是面向对象呢?面向对象指的是一种开发模式.早期的计算机编程使用的是面向过程的 ...