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 打印出所有的对象/模块的属性(实例代码)
Sep 11 Python
使用Python将数组的元素导出到变量中(unpacking)
Oct 27 Python
python 性能优化方法小结
Mar 31 Python
利用python打印出菱形、三角形以及矩形的方法实例
Aug 08 Python
Python实现感知机(PLA)算法
Dec 20 Python
Python测试网络连通性示例【基于ping】
Aug 03 Python
Python openpyxl 遍历所有sheet 查找特定字符串的方法
Dec 10 Python
Python实战之制作天气查询软件
May 14 Python
python Elasticsearch索引建立和数据的上传详解
Aug 04 Python
在django中自定义字段Field详解
Dec 03 Python
python利用xlsxwriter模块 操作 Excel
Oct 14 Python
python scipy 稀疏矩阵的使用说明
May 26 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.MVC的模板标签系统(三)
2006/09/05 PHP
PHP 得到根目录的 __FILE__ 常量
2008/07/23 PHP
PHP编程最快明白(第一讲 软件环境和准备工作)
2010/10/25 PHP
php加密解密实用类分享
2014/01/07 PHP
php的socket编程详解
2016/11/20 PHP
PHP attributes()函数讲解
2019/02/03 PHP
php layui实现前端多图上传实例
2019/07/30 PHP
Prototype1.6 JS 官方下载地址
2007/11/30 Javascript
JQuery实现简单验证码提示解决方案
2012/12/20 Javascript
js判断选择时间不能小于当前时间的示例代码
2013/09/24 Javascript
js 判断上传文件大小及格式代码
2013/11/13 Javascript
关于JS数组追加数组采用push.apply的问题
2014/06/09 Javascript
如何屏蔽防止别的网站嵌入框架代码
2015/08/24 Javascript
JQuery zClip插件实现复制页面内容到剪贴板
2015/11/02 Javascript
JavaScript_ECMA5数组新特性详解
2016/06/12 Javascript
JavaScript禁止用户多次提交的两种方法
2016/07/24 Javascript
JavaScript实现大图轮播效果
2017/01/11 Javascript
JavaScript常用正则验证函数实例小结【年龄,数字,Email,手机,URL,日期等】
2017/01/23 Javascript
判断滚动条滑到底部触发事件(实例讲解)
2017/11/15 Javascript
React diff算法的实现示例
2018/04/20 Javascript
vue之将echart封装为组件
2018/06/02 Javascript
vue实现打印功能的两种方法
2018/09/07 Javascript
VScode格式化ESlint方法(最全最好用方法)
2019/09/10 Javascript
浅谈Python的list中的选取范围
2018/11/12 Python
python+pyqt5编写md5生成器
2019/03/18 Python
python 中xpath爬虫实例详解
2019/08/26 Python
Python实现不规则图形填充的思路
2020/02/02 Python
python 实现线程之间的通信示例
2020/02/14 Python
Python sorted对list和dict排序
2020/06/09 Python
美国知名玩具品牌:Melissa & Doug
2016/08/16 全球购物
给女儿的表扬信
2014/01/18 职场文书
机械原理课程设计心得体会
2016/01/15 职场文书
nginx如何将http访问的网站改成https访问
2021/03/31 Servers
pytorch DataLoader的num_workers参数与设置大小详解
2021/05/28 Python
Nginx虚拟主机的搭建的实现步骤
2022/01/18 Servers
MySQL提升大量数据查询效率的优化神器
2022/07/07 MySQL