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连接MySQL数据库实例分析
May 12 Python
python写日志封装类实例
Jun 28 Python
使用Python多线程爬虫爬取电影天堂资源
Sep 23 Python
简单谈谈python中的语句和语法
Aug 10 Python
浅谈Python对内存的使用(深浅拷贝)
Jan 17 Python
浅谈pycharm的xmx和xms设置方法
Dec 03 Python
使用OpenCV实现仿射变换—缩放功能
Aug 29 Python
Python使用Slider组件实现调整曲线参数功能示例
Sep 06 Python
python实现画循环圆
Nov 23 Python
Python 实现Serial 与STM32J进行串口通讯
Dec 18 Python
Python面向对象程序设计之类和对象、实例变量、类变量用法分析
Mar 23 Python
python代码区分大小写吗
Jun 17 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
淘宝ip地址查询类分享(利用淘宝ip库)
2014/01/07 PHP
yii,CI,yaf框架+smarty模板使用方法
2015/12/29 PHP
jQuery中的$.ajax()方法应用
2014/05/06 Javascript
Jquery幻灯片特效代码分享--打开页面随机选择切换方式(3)
2015/08/15 Javascript
javascript每日必学之继承
2016/02/23 Javascript
浅析jquery数组删除指定元素的方法:grep()
2016/05/19 Javascript
vue.js实现表格合并示例代码
2016/11/30 Javascript
Jquery与Bootstrap实现后台管理页面增删改查功能示例
2017/01/22 Javascript
微信小程序 引用其他js文件实现代码
2017/02/22 Javascript
jQuery滑动到底部加载下一页数据的实例代码
2017/05/22 jQuery
详解如何用webpack打包一个网站应用项目
2017/07/12 Javascript
AngularJS修改model值时,显示内容不变的实例
2018/09/13 Javascript
vue里面使用mui的弹出日期选择插件实例
2018/09/16 Javascript
ES6中字符串的使用方法扩展
2019/06/04 Javascript
在vue-cli3中使用axios获取本地json操作
2020/07/30 Javascript
[02:39]DOTA2英雄基础教程 天怒法师
2013/11/29 DOTA
Python文件右键找不到IDLE打开项解决办法
2015/06/08 Python
详解pyppeteer(python版puppeteer)基本使用
2019/06/12 Python
使用python制作一个为hex文件增加版本号的脚本实例
2019/06/12 Python
Django 在iframe里跳转顶层url的例子
2019/08/21 Python
使用Python实现Wake On Lan远程开机功能
2020/01/22 Python
如何在django中添加日志功能
2020/02/06 Python
python 在threading中如何处理主进程和子线程的关系
2020/04/25 Python
python如何支持并发方法详解
2020/07/25 Python
scrapy利用selenium爬取豆瓣阅读的全步骤
2020/09/20 Python
Swisse官方海外旗舰店:澳大利亚销量领先,自然健康品牌
2017/12/15 全球购物
沙特阿拉伯电子产品和家用电器购物网站:Black Box
2019/07/24 全球购物
幼儿园园长自我鉴定
2013/10/22 职场文书
学生感冒英文请假条
2014/02/04 职场文书
致垒球运动员加油稿
2014/02/16 职场文书
幼儿教师师德师风自我剖析材料
2014/09/29 职场文书
2015年教师新年寄语
2014/12/08 职场文书
总经理岗位职责
2015/02/04 职场文书
2015毕业实习推荐信
2015/03/23 职场文书
运动会闭幕式通讯稿
2015/07/18 职场文书
写一个Python脚本自动爬取Bilibili小视频
2021/04/24 Python