Django logging配置及使用详解


Posted in Python onJuly 23, 2019

1. settings.py文件

做开发离不开必定离不开日志, 以下是我在工作中写Django项目常用的logging配置.

# 日志配置
BASE_LOG_DIR = os.path.join(BASE_DIR, "log")

LOGGING = {
  'version': 1, # 保留字
  'disable_existing_loggers': False, # 是否禁用已经存在的日志实例
  'formatters': { # 定义日志的格式
    'standard': {
      'format': '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]'
           '[%(levelname)s][%(message)s]'
    },
    'simple': {
      'format': '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
    },
    'collect': {
      'format': '%(message)s'
    }
  },
  'filters': { # 定义日志的过滤器
    'require_debug_true': {
      '()': 'django.utils.log.RequireDebugTrue',
    },
  },
  'handlers': { # 日志处理程序
    'console': {
      'level': 'DEBUG',
      'filters': ['require_debug_true'], # 只有在Django debug为True时才在屏幕打印日志
      'class': 'logging.StreamHandler',
      'formatter': 'simple'
    },
    'SF': {
      'level': 'INFO',
      'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,根据文件大小自动切
      'filename': os.path.join(BASE_LOG_DIR, "xxx_info.log"), # 日志文件
      'maxBytes': 1024 * 1024 * 500, # 日志大小 50M(最好不要超过1G)
      'backupCount': 3, # 备份数为3 xx.log --> xx.log.1 --> xx.log.2 --> xx.log.3
      'formatter': 'standard',
      'encoding': 'utf-8', # 文件记录的编码格式
    },
    'TF': {
      'level': 'INFO',
      'class': 'logging.handlers.TimedRotatingFileHandler', # 保存到文件,根据时间自动切
      'filename': os.path.join(BASE_LOG_DIR, "xxx_info.log"), # 日志文件
      'backupCount': 3, # 备份数为3 xx.log --> xx.log.2018-08-23_00-00-00 --> xx.log.2018-08-24_00-00-00 --> ...
      'when': 'D', # 每天一切, 可选值有S/秒 M/分 H/小时 D/天 W0-W6/周(0=周一) midnight/如果没指定时间就默认在午夜
      'formatter': 'standard',
      'encoding': 'utf-8',
    },
    'error': {
      'level': 'ERROR',
      'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
      'filename': os.path.join(BASE_LOG_DIR, "xxx_err.log"), # 日志文件
      'maxBytes': 1024 * 1024 * 5, # 日志大小 50M
      'backupCount': 5,
      'formatter': 'standard',
      'encoding': 'utf-8',
    },
    'collect': {
      'level': 'INFO',
      'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
      'filename': os.path.join(BASE_LOG_DIR, "xxx_collect.log"),
      'maxBytes': 1024 * 1024 * 50, # 日志大小 50M
      'backupCount': 5,
      'formatter': 'collect',
      'encoding': "utf-8"
    }
  },
  'loggers': { # 日志实例
    '': { # 默认的logger应用如下配置
      'handlers': ['SF', 'console', 'error'], # 上线之后可以把'console'移除
      'level': 'DEBUG',
      'propagate': True, # 是否向上一级logger实例传递日志信息
    },
    'collect': { # 名为 'collect' 的logger还单独处理
      'handlers': ['console', 'collect'],
      'level': 'INFO',
    }
  },
}

2. 在Django根目录下创建log文件夹

3. logging的使用

有了logging配置之后, 我们在今后的项目中, 就尽量不再使用print语句来打印信息, 进行BUG调试. 更专业的我们将使用logger对象来保存并打印错误信息.

例如:

import logging

# 实例化logging对象,并以当前文件的名字作为logger实例的名字
logger = logging.getLogger(__name__)
# 生成一个名字叫做 collect 的日志实例
logger_c = logging.getLogger('collect')

class Foo(object):
  def test(self, data):
    logger.debug(data) # 打印data
    try:
      ...
    except Exception as e:
      logger.error(str(e))  # 保存并打印错误信息

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现测试磁盘性能的方法
Mar 12 Python
玩转python爬虫之爬取糗事百科段子
Feb 17 Python
Python 和 JS 有哪些相同之处
Nov 23 Python
python学生管理系统代码实现
Apr 05 Python
python+opencv识别图片中的圆形
Mar 25 Python
python pygame实现2048游戏
Nov 20 Python
深入了解python中元类的相关知识
Aug 29 Python
pygame实现俄罗斯方块游戏(基础篇2)
Oct 29 Python
使用pygame写一个古诗词填空通关游戏
Dec 03 Python
Keras中的多分类损失函数用法categorical_crossentropy
Jun 11 Python
如何利用python发送邮件
Sep 26 Python
Python就将所有的英文单词首字母变成大写
Feb 12 Python
Python利用scapy实现ARP欺骗的方法
Jul 23 #Python
OpenCV3.0+Python3.6实现特定颜色的物体追踪
Jul 23 #Python
提升Python效率之使用循环机制代替递归函数
Jul 23 #Python
深入了解Django View(视图系统)
Jul 23 #Python
Python Opencv任意形状目标检测并绘制框图
Jul 23 #Python
flask框架单元测试原理与用法实例分析
Jul 23 #Python
Python3的高阶函数map,reduce,filter的示例详解
Jul 23 #Python
You might like
php调整gif动画图片尺寸示例代码分享
2013/12/05 PHP
Drupal7连接多个数据库及常见问题解决
2014/03/02 PHP
PHP的PDO操作简单示例
2016/03/30 PHP
php异常处理捕获错误整理
2019/09/23 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
Prototype使用指南之dom.js
2007/01/10 Javascript
JAVASCRIPT HashTable
2007/01/22 Javascript
利用javascript移动div层-javascript 拖动层
2009/03/22 Javascript
jQuery 判断页面元素是否存在的代码
2009/08/14 Javascript
整理一些JavaScript的IE和火狐的兼容性注意事项
2011/03/17 Javascript
javascript事件冒泡详解和捕获、阻止方法
2014/04/12 Javascript
Egret引擎开发指南之发布项目
2014/09/03 Javascript
JavaScript数组迭代器实例分析
2015/06/09 Javascript
javascript 应用小技巧方法汇总
2015/07/05 Javascript
举例讲解JavaScript中关于对象操作的相关知识
2015/11/16 Javascript
JS面向对象(3)之Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法
2016/02/25 Javascript
JS操作COOKIE实现备忘记录的方法
2016/04/01 Javascript
无缝滚动的简单实现代码(推荐)
2016/06/07 Javascript
详解node-ccap模块生成captcha验证码
2017/07/01 Javascript
JavaScript事件发布/订阅模式原理与用法分析
2018/08/21 Javascript
Node.js连接Sql Server 2008及数据层封装详解
2018/08/27 Javascript
解决vue.js this.$router.push无效的问题
2018/09/03 Javascript
react脚手架如何配置less和ant按需加载的方法步骤
2018/11/28 Javascript
[01:29]2017 DOTA2国际邀请赛官方英雄手办展示
2017/03/18 DOTA
python实现从ftp服务器下载文件的方法
2015/04/30 Python
Python给你的头像加上圣诞帽
2018/01/04 Python
微信跳一跳python辅助脚本(总结)
2018/01/11 Python
解决pycharm无法识别本地site-packages的问题
2018/10/13 Python
python调用opencv实现猫脸检测功能
2019/01/15 Python
浅谈python 中类属性共享的问题
2019/07/02 Python
python实现在线翻译功能
2020/03/03 Python
使用Python实现批量ping操作方法
2020/05/06 Python
应届专科生个人的自我评价
2014/01/05 职场文书
小学优秀教育工作者事迹材料
2014/05/09 职场文书
2014年学校卫生工作总结
2014/11/20 职场文书
2015年乡镇食品安全工作总结
2015/10/22 职场文书