Python中logging日志库实例详解


Posted in Python onFebruary 19, 2020

logging的简单使用

用作记录日志,默认分为六种日志级别(括号为级别对应的数值)

  1. NOTSET(0)
  2. DEBUG(10)
  3. INFO(20)
  4. WARNING(30)
  5. ERROR(40)
  6. CRITICAL(50)

special

  • 在自定义日志级别时注意不要和默认的日志级别数值相同
  • logging 执行时输出大于等于设置的日志级别的日志信息,如设置日志级别是 INFO,则 INFO、WARNING、ERROR、CRITICAL 级别的日志都会输出。

|2logging常见对象

  • Logger:日志,暴露函数给应用程序,基于日志记录器和过滤器级别决定哪些日志有效。
  • LogRecord :日志记录器,将日志传到相应的处理器处理。
  • Handler :处理器, 将(日志记录器产生的)日志记录发送至合适的目的地。
  • Filter :过滤器, 提供了更好的粒度控制,它可以决定输出哪些日志记录。
  • Formatter:格式化器, 指明了最终输出中日志记录的格式。

|3logging基本使用

logging 使用非常简单,使用 basicConfig() 方法就能满足基本的使用需要;如果方法没有传入参数,会根据默认的配置创建Logger 对象,默认的日志级别被设置为 WARNING,该函数可选的参数如下表所示。

参数名称 参数描述
filename 日志输出到文件的文件名
filemode 文件模式,r[+]、w[+]、a[+]
format 日志输出的格式
datefat 日志附带日期时间的格式
style 格式占位符,默认为 "%" 和 “{}”
level 设置日志输出级别
stream 定义输出流,用来初始化 StreamHandler 对象,不能 filename 参数一起使用,否则会ValueError 异常
handles 定义处理器,用来创建 Handler 对象,不能和 filename 、stream 参数一起使用,否则也会抛出 ValueError 异常

logging代码

logging.debug("debug")
 logging.info("info")
 logging.warning("warning")
 logging.error("error")5 logging.critical("critical")

测试结果

WARNING:root:warning
ERROR:root:error
CRITICAL:root:critical

但是当发生异常时,直接使用无参数的 debug() 、 info() 、 warning() 、 error() 、 critical() 方法并不能记录异常信息,需要设置 exc_info=True 才可以,或者使用 exception() 方法,还可以使用 log() 方法,但还要设置日志级别和 exc_info 参数

a = 5
 b = 0
 try:
 c = a / b
 except Exception as e:
 # 下面三种方式三选一,推荐使用第一种
 logging.exception("Exception occurred")
 logging.error("Exception occurred", exc_info=True)
 logging.log(level=logging.ERROR, msg="Exception occurred", exc_info=True)

|4logging之Formatter对象

Formatter 对象用来设置具体的输出格式,常用格式如下表所示

格式 变量描述
%(asctime)s 将日志的时间构造成可读的形式,默认情况下是精确到毫秒,如 2018-10-13 23:24:57,832,可以额外指定 datefmt 参数来指定该变量的格式
%(name) 日志对象的名称
%(filename)s 不包含路径的文件名
%(pathname)s 包含路径的文件名
%(funcName)s 日志记录所在的函数名
%(levelname)s 日志的级别名称
%(message)s 具体的日志信息
%(lineno)d 日志记录所在的行号
%(pathname)s 完整路径
%(process)d 当前进程ID
%(processName)s 当前进程名称
%(thread)d 当前线程ID
%threadName)s 当前线程名称

|5logging封装类

#!/usr/bin/env python
 # -*- coding: utf-8 -*-
 """
 __title__ = logging工具类
 __Time__ = 2019/8/8 19:26
 """
 import logging
 from logging import handlers
 class Loggers:
  __instance = None
  def __new__(cls, *args, **kwargs):
   if not cls.__instance:
    cls.__instance = object.__new__(cls, *args, **kwargs)
   return cls.__instance
  def __init__(self):
   # 设置输出格式
   formater = logging.Formatter(
    '[%(asctime)s]-[%(levelname)s]-[%(filename)s]-[%(funcName)s:%(lineno)d] : %(message)s')
   # 定义一个日志收集器
   self.logger = logging.getLogger('log')
   # 设定级别
   self.logger.setLevel(logging.DEBUG)
   # 输出渠道一 - 文件形式
   self.fileLogger = handlers.RotatingFileHandler("./test.log", maxBytes=5242880, backupCount=3)
   # 输出渠道二 - 控制台
   self.console = logging.StreamHandler()
   # 控制台输出级别
   self.console.setLevel(logging.DEBUG)
   # 输出渠道对接输出格式
   self.console.setFormatter(formater)
   self.fileLogger.setFormatter(formater)
   # 日志收集器对接输出渠道
   self.logger.addHandler(self.fileLogger)
   self.logger.addHandler(self.console)
  def debug(self, msg):
   self.logger.debug(msg=msg)
  def info(self, msg):
   self.logger.info(msg=msg)
  def warn(self, msg):
   self.logger.warning(msg=msg)
  def error(self, msg):
   self.logger.error(msg=msg)
  def excepiton(self, msg):
   self.logger.exception(msg=msg)
 loggers = Loggers()
 if __name__ == '__main__':
  loggers.debug('debug')
  loggers.info('info')

|6logzero封装类

#!/usr/bin/env python
 # -*- coding: utf-8 -*-
 """
 __title__ = logzero日志封装类
 __Time__ = 2019/8/8 19:26
 """
 import logging
 import logzero
 from logzero import logger
 class Logzero(object):
  __instance = None
  def __new__(cls, *args, **kwargs):
   if not cls.__instance:
    cls.__instance = object.__new__(cls, *args, **kwargs)
   return cls.__instance
  def __init__(self):
   self.logger = logger
   # console控制台输入日志格式 - 带颜色
   self.console_format = '%(color)s' \
        '[%(asctime)s]-[%(levelname)1.1s]-[%(filename)s]-[%(funcName)s:%(lineno)d] 日志信息: %(message)s ' \
        '%(end_color)s '
   # 创建一个Formatter对象
   self.formatter = logzero.LogFormatter(fmt=self.console_format)
   # 将formatter提供给setup_default_logger方法的formatter参数
   logzero.setup_default_logger(formatter=self.formatter)
   # 设置日志文件输出格式
   self.formater = logging.Formatter(
    '[%(asctime)s]-[%(levelname)s]-[%(filename)s]-[%(funcName)s:%(lineno)d] 日志信息: %(message)s')
   # 设置日志文件等级
   logzero.loglevel(logging.DEBUG)
   # 输出日志文件路径和格式
   logzero.logfile("F:\\imocInterface\\log/tests.log", formatter=self.formater)
  def debug(self, msg):
   self.logger.debug(msg=msg)
  def info(self, msg):
   self.logger.info(msg=msg)
  def warning(self, msg):
   self.logger.warning(msg=msg)
  def error(self, msg):
   self.logger.error(msg=msg)
  def exception(self, msg):
   self.logger.exception(msg=msg)
 logzeros = Logzero()
 if __name__ == '__main__':
  logzeros.debug("debug")
  logzeros.info("info")
  logzeros.warning("warning")
  logzeros.error("error")
  a = 5
  b = 0
  try:
   c = a / b
  except Exception as e:
   logzeros.exception("Exception occurred")

总结

以上所述是小编给大家介绍的Python中logging日志库实例详解,希望对大家有所帮助,也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python中的rfind()方法使用详解
May 19 Python
Python 自动刷博客浏览量实例代码
Jun 14 Python
Python3 实现随机生成一组不重复数并按行写入文件
Apr 09 Python
python如何查看微信消息撤回
Nov 27 Python
如何用Python做一个微信机器人自动拉群
Jul 03 Python
使用Python轻松完成垃圾分类(基于图像识别)
Jul 09 Python
简单了解python变量的作用域
Jul 30 Python
PyTorch的Optimizer训练工具的实现
Aug 18 Python
python中enumerate() 与zip()函数的使用比较实例分析
Sep 03 Python
使用Python和百度语音识别生成视频字幕的实现
Apr 09 Python
Django多个app urls配置代码实例
Nov 26 Python
django项目中使用云片网发送短信验证码的实现
Jan 19 Python
在Python中通过threshold创建mask方式
Feb 19 #Python
python实现简单颜色识别程序
Feb 19 #Python
python绘制封闭多边形教程
Feb 18 #Python
python Shapely使用指南详解
Feb 18 #Python
Python模拟FTP文件服务器的操作方法
Feb 18 #Python
git查看、创建、删除、本地、远程分支方法详解
Feb 18 #Python
Python使用urllib模块对URL网址中的中文编码与解码实例详解
Feb 18 #Python
You might like
php中json_decode()和json_encode()的使用方法
2012/06/04 PHP
PHP实现UTF-8文件BOM自动检测与移除实例
2014/11/05 PHP
解析WordPress中的post_class与get_post_class函数
2016/01/04 PHP
PHP解压ZIP文件到指定文件夹的方法
2016/11/17 PHP
PHP实现向关联数组指定的Key之前插入元素的方法
2017/06/06 PHP
Laravel 的数据库迁移的方法
2017/07/31 PHP
jquery tablesorter.js 支持中文表格排序改进
2009/12/09 Javascript
使用JS进行目录上传(相当于批量上传)
2010/12/05 Javascript
window.location不跳转的问题解决方法
2014/04/17 Javascript
PhantomJS快速入门教程(服务器端的 JavaScript API 的 WebKit)
2015/08/06 Javascript
理解javascript中的MVC模式
2016/01/28 Javascript
jquery pagination插件动态分页实例(Bootstrap分页)
2016/12/23 Javascript
Vue.js中用webpack合并打包多个组件并实现按需加载
2017/02/17 Javascript
webpack实现热更新(实施同步刷新)
2017/07/28 Javascript
JS声明对象时属性名加引号与不加引号的问题及解决方法
2018/02/16 Javascript
Vue2.0实现调用摄像头进行拍照功能 exif.js实现图片上传功能
2018/04/28 Javascript
js实现上传按钮并显示缩略图小轮子
2020/05/04 Javascript
Vue向后台传数组数据,springboot接收vue传的数组数据实例
2020/11/12 Javascript
python快速查找算法应用实例
2014/09/26 Python
Python的加密模块md5、sha、crypt使用实例
2014/09/28 Python
python嵌套字典比较值与取值的实现示例
2017/11/03 Python
python数字图像处理实现直方图与均衡化
2018/05/04 Python
基于DataFrame改变列类型的方法
2018/07/25 Python
详解python持久化文件读写
2019/04/06 Python
使用python PIL库实现简单验证码的去噪方法步骤
2019/05/10 Python
Django基于Models定制Admin后台实现过程解析
2020/11/11 Python
详解canvas绘制多张图的排列顺序问题
2019/01/21 HTML / CSS
三星法国官方网站:Samsung法国
2019/10/31 全球购物
Eton丹麦官网:精美的男式衬衫
2020/05/27 全球购物
银行服务感言
2014/03/01 职场文书
高校教师自荐信范文
2014/03/13 职场文书
党的群众路线教育实践活动个人对照检查材料范文
2014/09/25 职场文书
大学班干部竞选稿
2015/11/20 职场文书
Oracle11g R2 安装教程完整版
2021/06/04 Oracle
CSS布局之浮动(float)和定位(position)属性的区别
2021/09/25 HTML / CSS
聊聊SpringBoot自动装配的魔力
2021/11/17 Java/Android