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使用marshal模块序列化实例
Sep 25 Python
Python类属性与实例属性用法分析
May 09 Python
python转换字符串为摩尔斯电码的方法
Jul 06 Python
python文件的md5加密方法
Apr 06 Python
python web.py开发httpserver解决跨域问题实例解析
Feb 12 Python
Python中判断输入是否为数字的实现代码
May 26 Python
python分块读取大数据,避免内存不足的方法
Dec 10 Python
使用Python横向合并excel文件的实例
Dec 11 Python
基于python traceback实现异常的获取与处理
Dec 13 Python
Python破解BiliBili滑块验证码的思路详解(完美避开人机识别)
Feb 17 Python
python实现网络五子棋
Apr 11 Python
如何基于python实现单目三维重建详解
Jun 25 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 5.0对象模型深度探索之对象复制
2008/03/27 PHP
PHP企业级应用之常见缓存技术篇
2011/01/27 PHP
递归实现php数组转xml的代码分享
2015/05/14 PHP
php使用curl详细解析及问题汇总
2016/08/11 PHP
PHP chr()函数讲解
2019/02/11 PHP
Laravel Reponse响应客户端示例详解
2020/09/03 PHP
asp javascript 实现关闭窗口时保存数据的办法
2007/11/24 Javascript
js 操作css实现代码
2009/06/11 Javascript
Javascript学习笔记1 数据类型
2010/01/11 Javascript
Json2Template.js 基于jquery的插件 绑定JavaScript对象到Html模板中
2011/10/29 Javascript
Extjs4中tree的拖拽功能(可以两棵树之间拖拽) 简单实例
2013/12/08 Javascript
jquery选择符快速提取web表单数据示例
2014/03/27 Javascript
关于动态执行代码(js的Eval)实例详解
2016/08/15 Javascript
jquery.multiselect多选下拉框实现代码
2016/11/11 Javascript
jQuery为某个div加入行样式
2017/06/09 jQuery
详解React-Native全球化多语言切换工具库react-native-i18n
2017/11/03 Javascript
微信小程序倒计时功能实现代码
2017/11/09 Javascript
JS中常用的消息框总结
2018/02/24 Javascript
简述JS控制台的使用
2018/07/15 Javascript
基于jQuery ztree实现表格风格的树状结构
2018/08/31 jQuery
一百行JS代码实现一个校验工具
2019/04/30 Javascript
JavaScript实现网页tab栏效果制作
2020/11/20 Javascript
python计算最大优先级队列实例
2013/12/18 Python
在Python中使用模块的教程
2015/04/27 Python
Python使用functools模块中的partial函数生成偏函数
2016/07/02 Python
python实现k-means聚类算法
2018/02/23 Python
python3+PyQt5实现支持多线程的页面索引器应用程序
2018/04/20 Python
python spyder中读取txt为图片的方法
2018/04/27 Python
python opencv判断图像是否为空的实例
2019/01/26 Python
浅析Django中关于session的使用
2019/12/30 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
2020/11/17 Python
详解Pymongo常用查询方法总结
2021/01/29 Python
阿玛尼美妆俄罗斯官网:Giorgio Armani Beauty RU
2020/07/19 全球购物
倡议书范文大全
2015/04/28 职场文书
实操Python爬取觅知网素材图片示例
2021/11/27 Python
云服务器部署 Web 项目的实现步骤
2022/06/28 Servers