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中的ctime()方法使用教程
May 22 Python
搭建Python的Django框架环境并建立和运行第一个App的教程
Jul 02 Python
Python利用递归和walk()遍历目录文件的方法示例
Jul 14 Python
python版微信跳一跳游戏辅助
Jan 11 Python
Python+matplotlib实现华丽的文本框演示代码
Jan 22 Python
pandas去重复行并分类汇总的实现方法
Jan 29 Python
对python tkinter窗口弹出置顶的方法详解
Jun 14 Python
Python直接赋值、浅拷贝与深度拷贝实例分析
Jun 18 Python
Python获取命令实时输出-原样彩色输出并返回输出结果的示例
Jul 11 Python
在Python中字符串、列表、元组、字典之间的相互转换
Nov 15 Python
Python3交互式shell ipython3安装及使用详解
Jul 11 Python
Python 如何调试程序崩溃错误
Aug 03 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文件
2007/01/04 PHP
php中全局变量global的使用演示代码
2011/05/18 PHP
php ajax 静态分页过程形式
2011/09/02 PHP
解决文件名解压后乱码的问题 将文件名进行转码的代码
2012/01/10 PHP
PHP实现即时输出、实时输出内容方法
2015/05/27 PHP
php、java、android、ios通用的3des方法(推荐)
2016/09/09 PHP
javascript 复杂的嵌套环境中输出单引号和双引号
2009/05/26 Javascript
node.js中的http.request方法使用说明
2014/12/14 Javascript
jQuery获取checkboxlist的value值的方法
2015/09/27 Javascript
JavaScript模版引擎的基本实现方法浅析
2016/02/15 Javascript
基于jquery实现图片放大功能
2016/05/07 Javascript
很实用的js选项卡切换效果
2016/08/12 Javascript
jQuery中 DOM节点操作方法大全
2017/10/12 jQuery
jquery实现楼层滚动效果
2018/01/01 jQuery
在Vue中使用highCharts绘制3d饼图的方法
2018/02/08 Javascript
nodejs语言实现验证码生成功能的示例代码
2019/10/13 NodeJs
小程序选项卡以及swiper套用(跨页面)
2020/06/19 Javascript
python计算N天之后日期的方法
2015/03/31 Python
使用wxPython获取系统剪贴板中的数据的教程
2015/05/06 Python
python非递归全排列实现方法
2017/04/10 Python
python实现简单聊天应用 python群聊和点对点均实现
2017/09/14 Python
python flask实现分页的示例代码
2018/08/02 Python
python面试题之列表声明实例分析
2019/07/08 Python
python3 selenium自动化 frame表单嵌套的切换方法
2019/08/23 Python
Django跨域资源共享问题(推荐)
2020/03/09 Python
css3图片边框border-image的用法
2017/06/30 HTML / CSS
Saucony澳大利亚官网:美国跑鞋品牌,运动鞋中的劳斯莱斯
2018/05/05 全球购物
意大利灯具购物网站:Lampade.it
2018/10/18 全球购物
一些网络技术方面的面试题
2014/05/01 面试题
自我评价的写作规则
2014/01/06 职场文书
职业生涯规划书怎么写?
2014/09/14 职场文书
大学生第一学年自我鉴定2015
2014/09/28 职场文书
公司承诺函范文
2015/01/21 职场文书
2016年“抗战胜利纪念日”71周年校园广播稿
2015/12/18 职场文书
2016年安全生产先进个人事迹材料
2016/02/29 职场文书
springBoot基于webSocket实现扫码登录
2021/06/22 Java/Android