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的ORM框架中SQLAlchemy库的查询操作的教程
Apr 25 Python
python使用正则表达式提取网页URL的方法
May 26 Python
使用Python生成XML的方法实例
Mar 21 Python
Python获取SQLite查询结果表列名的方法
Jun 21 Python
Python爬虫抓取代理IP并检验可用性的实例
May 07 Python
python安装pil库方法及代码
Jun 25 Python
Python 使用PyQt5 完成选择文件或目录的对话框方法
Jun 27 Python
使用 Python 在京东上抢口罩的思路详解
Feb 27 Python
利用Python脚本批量生成SQL语句
Mar 04 Python
Python爬虫设置ip代理过程解析
Jul 20 Python
Python代码注释规范代码实例解析
Aug 14 Python
Python的信号库Blinker用法详解
Dec 31 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
ThinkPHP使用Smarty第三方插件方法小结
2016/03/19 PHP
tp5.0框架隐藏index.php入口文件及模块和控制器的方法分析
2020/02/11 PHP
Javascript 多浏览器兼容总结(实战经验)
2013/10/30 Javascript
jQuery聚合函数实例
2015/05/21 Javascript
JS获取复选框的值,并传递到后台的实现方法
2016/05/30 Javascript
vue分页组件table-pagebar使用实例解析
2020/11/15 Javascript
浅谈JavaScript 覆盖原型以及更改原型
2016/08/31 Javascript
addEventListener()与removeEventListener()解析
2017/04/20 Javascript
JavaScript中Require调用js的实例分享
2017/10/27 Javascript
jQuery除指定区域外点击任何地方隐藏DIV功能
2017/11/13 jQuery
Vue源码解读之Component组件注册的实现
2018/08/24 Javascript
重学JS 系列:聊聊继承(推荐)
2019/04/11 Javascript
Selenium执行Javascript脚本参数及返回值过程详解
2020/04/01 Javascript
基于vue中的scoped坑点解说
2020/09/04 Javascript
python对url格式解析的方法
2015/05/13 Python
Python实现的使用telnet登陆聊天室实例
2015/06/17 Python
浅谈Python中列表生成式和生成器的区别
2015/08/03 Python
Python判断文本中消息重复次数的方法
2016/04/27 Python
python版本坑:md5例子(python2与python3中md5区别)
2017/06/20 Python
Python实现获取前100组勾股数的方法示例
2018/05/04 Python
利用python实现对web服务器的目录探测的方法
2019/02/26 Python
Django 内置权限扩展案例详解
2019/03/04 Python
python实现视频读取和转化图片
2019/12/10 Python
Cython编译python为so 代码加密示例
2019/12/23 Python
python中执行smtplib失败的处理方法
2020/07/01 Python
利用纯css3实现的文字亮光特效的代码演示
2014/11/27 HTML / CSS
Bulk Powders意大利:运动补充在线商店
2019/02/09 全球购物
《在山的那边》教学反思
2014/02/23 职场文书
煤矿安全演讲稿
2014/05/09 职场文书
国家奖学金获奖感言
2014/08/16 职场文书
发展党员工作情况汇报
2014/10/28 职场文书
施工安全保证书
2015/05/09 职场文书
热爱劳动主题班会
2015/08/14 职场文书
2016学习依法治国心得体会
2016/01/15 职场文书
2016学校先进党组织事迹材料
2016/02/29 职场文书
B站评分公认最好看的动漫,你的名字评分9.9,第六备受喜欢
2022/03/18 日漫