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命令行参数sys.argv使用示例
Jan 28 Python
python基础教程之对象和类的实际运用
Aug 29 Python
用Python创建声明性迷你语言的教程
Apr 13 Python
怎样使用Python脚本日志功能
Aug 14 Python
python实现读取excel写入mysql的小工具详解
Nov 20 Python
pycharm执行python时,填写参数的方法
Oct 29 Python
python爬虫之urllib,伪装,超时设置,异常处理的方法
Dec 19 Python
python基于socket实现的UDP及TCP通讯功能示例
Nov 01 Python
pytorch 实现张量tensor,图片,CPU,GPU,数组等的转换
Jan 13 Python
Python CategoricalDtype自定义排序实现原理解析
Sep 11 Python
python3访问字典里的值实例方法
Nov 18 Python
python drf各类组件的用法和作用
Jan 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
服务器端解压缩zip的脚本
2006/12/22 PHP
基于MySQL体系结构的分析
2013/05/02 PHP
PHP面向对象精要总结
2014/11/07 PHP
PHP遍历数组的三种方法及效率对比分析
2015/02/12 PHP
PHP预定义变量9大超全局数组用法详解
2016/04/23 PHP
php面试实现反射注入的详细方法
2019/09/30 PHP
一个可拖拽列宽表格实例演示
2012/11/26 Javascript
IE6浏览器下resize事件被执行了多次解决方法
2012/12/11 Javascript
JavaScript中的连字符详解
2013/11/28 Javascript
js如何判断用户是否是用微信浏览器
2014/06/05 Javascript
21个JavaScript事件(Events)属性汇总
2014/12/02 Javascript
详谈jQuery操纵DOM元素属性 attr()和removeAtrr()方法
2015/01/22 Javascript
JavaScript移除数组内重复元素的方法
2015/03/18 Javascript
JavaScript中用getDate()方法返回指定日期的教程
2015/06/09 Javascript
Bootstrap整体框架之CSS12栅格系统
2016/12/15 Javascript
JS 实现随机验证码功能
2017/02/15 Javascript
H5图片压缩与上传实例
2017/04/21 Javascript
JS简单生成由字母数字组合随机字符串示例
2018/05/25 Javascript
Mint UI实现A-Z字母排序的城市选择列表
2018/12/28 Javascript
jquery的$().each和$.each的区别
2019/01/18 jQuery
vue实现日历备忘录功能
2020/09/24 Javascript
vue quill editor 使用富文本添加上传音频功能
2020/01/14 Javascript
jquery实现拖拽小方块效果
2020/12/10 jQuery
[08:17]Ti9 现场cosplay
2019/09/10 DOTA
python爬虫教程之爬取百度贴吧并下载的示例
2014/03/07 Python
python实现将汉字转换成汉语拼音的库
2015/05/05 Python
python实现整数的二进制循环移位
2019/03/08 Python
DataFrame.to_excel多次写入不同Sheet的实例
2019/12/02 Python
怎样有效的进行自我评价
2013/10/06 职场文书
关于期中考试的反思
2014/02/02 职场文书
融资租赁计划书
2014/04/29 职场文书
通信工程专业求职信
2014/06/04 职场文书
售后客服个人自我评价
2014/09/14 职场文书
基层党员学习党的群众路线教育实践活动心得体会
2014/11/04 职场文书
周末问候语大全
2015/11/10 职场文书
mysql升级到5.7时,wordpress导数据报错1067的问题
2021/05/27 MySQL