我们在写程序的时候经常会打一些日志来帮助我们查找问题,这次学习一下logging模块,在python里面如何操作日志。
介绍一下logging模块,logging模块就是python里面用来操作日志的模块,logging模块中主要有4个类,分别负责不同的工作:

Logger 记录器,暴露了应用程序代码能直接使用的接口;简单点说就是一个创建一个办公室,让人在里头工作

Handler 处理器,将(记录器产生的)日志记录发送至合适的目的地;这个简单点说就是办事的人,你可以指定是让在控制输出日志,还是在文件里面打印日志,常用的有4种:

StreamHandler 控制台输出

FileHandler 文件输出

下面两种需要导入

handlers
                        from logging import handlers

TimedRotatingFileHandler 按照时间自动分割日志文件

RotatingFileHandler 按照大小自动分割日志文件,一旦达到指定的大小重新生成文件

Filter过滤器,提供了更好的粒度控制,它可以决定输出哪些日志记录。(不常用)

Formatter格式化器,指明了最终输出中日志记录的布局。指定输出日志的格式

import logging
from logging import handlers
#只在控制台打印日志
logging.basicConfig(level=logging.ERROR,#控制台打印的日志级别format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'#日志格式)
logging.debug('debug级别,最低级别,一般开发人员用来打印一些调试信息')
logging.info('info级别,正常输出信息,一般用来打印一些正常的操作')
logging.warning('waring级别,一般用来打印警信息')
logging.error('error级别,一般用来打印一些错误信息')
logging.critical('critical级别,一般用来打印一些致命的错误信息')

日志级别 debug < info < warning < error < critical
设置了日志级别之后,会打印该级别以及比该级别高的所有日志,举个例子,如果日志级别是warning,那么就会打印warning、error、critical,这三个级别的日志,不会打印debug和info级别的,如果是debug,最低级别的日志,那么所有的日志都会打印。
上面的只是在控制台打印日志,并没有把日志写在文件里面,一般我们都会把日志写在日志文件里面,也很简单,只需要加个参数指定文件名就行了。

logging.basicConfig(level=logging.ERROR,#控制台打印的日志级别filename='log.txt',#文件名filemode='a',#模式,有w和a,w就是写模式,每次都会重新写日志,覆盖之前的日志#a是追加模式,默认如果不写的话,就是追加模式format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'#工作中常用的日志格式)
logging.debug('debug级别,最低级别,一般开发人员用来打印一些调试信息')
logging.info('info级别,正常输出信息,一般用来打印一些正常的操作')
logging.warning('waring级别,一般用来打印警信息')
logging.error('error级别,一般用来打印一些错误信息')
logging.critical('critical级别,一般用来打印一些致命的错误信息')

加上文件名之后就会发现控制台不会输出日志了,日志文件也产生了,那么如何既在控制台输出日志,也在文件中写入呢?

怎么实现呢,就得有个办公室,里面塞俩人,一个给负责往控制台输出日志,一个负责写文件,你把他俩往办公室一塞,他俩就能干活了。

import logging
from logging import handlers
logger = logging.getLogger('my_log')
#先创建一个logger对象,相当于这个办公室,也就是上面说的Logger
logger.setLevel(logging.INFO)#设置日志的总级别
fh = logging.FileHandler('test.log',mode='a',encoding='utf-8')#创建一个文件处理器,也就是把日志写到文件里头
fh.setLevel(logging.INFO)#设置文件输出的级别
sh = logging.StreamHandler()#创建一个控制台输出的处理器,这两个就是上面说的Handler
sh.setLevel(logging.INFO)
#设置控制台输出的日志级别,这两个级别都可以单独设置,他们俩和logger的级别区别是如果logger设置的级别比里面的handler级别设置的高,那么就以logger的级别为准
th = handlers.TimedRotatingFileHandler('time',when='S',interval=1,backupCount=2)
#指定间隔时间自动生成文件的处理器
#interval是时间间隔,backupCount是备份文件的个数,如果超过这个超过这个个数,就会自动删除,when是间隔的时间单位,单位有以下几种:# S 秒# M 分# H 小时、# D 天、# W 每星期(interval==0时代表星期一)# midnight 每天凌晨
th.setLevel(logging.INFO)
formater = logging.Formatter('%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')
#指定日志格式,上面咱们写了常用的格式,直接指定了就行了,这也就是咱们上面说的Formatter
sh.setFormatter(formater)
fh.setFormatter(formater)
th.setFormatter(formater)
#设置两个处理器的日志格式logger.addHandler(sh)
logger.addHandler(fh)
logger.addHandler(th)
#把两个handler加入容器里头,相当于把工作人员培训完了,你们可以上班了
logger.debug('debug级别,最低级别,一般开发人员用来打印一些调试信息')
logger.info('info级别,正常输出信息,一般用来打印一些正常的操作')
logger.warning('waring级别,一般用来打印警信息')
logger.error('error级别,一般用来打印一些错误信息')
logger.critical('critical级别,一般用来打印一些致命的错误信息')

这样logger这个日志办公室已经搞好了,咱们就可以直接用了,运行完发现文件也产生了,控制台也有日志。如果不设置日志级别的话,默认级别是waring。
下面我们自己封装一个类来使用logging模块,方便使用,默认加一些配置

import logging
from logging import handlers
class MyLogger():def __init__(self,file_name,level='info',backCount=5,when='M'):logger = logging.getLogger()  # 先实例化一个logger对象,先创建一个办公室logger.setLevel(self.get_level(level))  # 设置日志的级别的人cl = logging.StreamHandler()  # 负责往控制台输出的人bl = handlers.TimedRotatingFileHandler(filename=file_name, when=when, interval=1, backupCount=backCount, encoding='utf-8')fmt = logging.Formatter('%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')  #时间  #打印哪个python文件的第几行  #日志级别  #打印的信息cl.setFormatter(fmt)  # 设置控制台输出的日志格式bl.setFormatter(fmt)  # 设置文件里面写入的日志格式logger.addHandler(cl)logger.addHandler(bl)self.logger = loggerdef get_level(self,str):level = {'debug':logging.DEBUG,'info':logging.INFO,'warn':logging.WARNING,'error':logging.ERROR}str = str.lower()return level.get(str)
if __name__ == '__main__':lw_log = MyLogger('lw.log','debug',when='M')lw_log.logger.warning('哈哈哈')

由于logging模块用起来实在是费劲,所以牛教授自己封装了一个日志模块供大家使用,非常方便,只需要直接pip install nnlog即可

使用例子如下代码:

import nnlog
log = nnlog.Logger(file_name='my.log',level='debug',when='D',backCount=5,interval=1)
#file_name是日志文件名
#level是日志级别,如果不传的话默认是debug级别
#when是日志文件多久生成一个,默认是按天,S 秒、M 分、 H 小时、 D 天、 W 每星期
#backCount是备份几个日志文件,默认保留5天的
#interval是间隔多久生成一个日志文件,默认是1天
log.debug('默认日志级别是debug')
log.info('info级别')
log.warning('waring级别')
log.error('error级别')log2 = nnlog.Logger(file_name='nn.log') #直接传入文件名也是ok的,其他的就取默认值了
log2.debug('test')

转载于:https://www.cnblogs.com/mululu/p/9121770.html

python学习笔记(二十八)日志模块相关推荐

  1. Python学习日记(二十八) hashlib模块、configparse模块、logging模块

    hashlib模块 主要提供字符加密算法功能,如md5.sha1.sha224.sha512.sha384等,这里的加密算法称为摘要算法.什么是摘要算法?它又称为哈希算法.散列算法,它通过一个函数把任 ...

  2. 嵌入式系统设计师学习笔记二十八:嵌入式程序设计③——高级程序设计语言

    嵌入式系统设计师学习笔记二十八:嵌入式程序设计③--高级程序设计语言 解释程序和编译程序 编译器的工作阶段示意图 语法错误:非法字符,关键字或标识符拼写错误 语法错误:语法结构出错,if--endif ...

  3. Mr.J-- jQuery学习笔记(二十八)--DOM操作方法(添加方法总结)

    Table of Contents appendTo appendTo(source, target) 源代码 append prependTo ​ ​ ​ ​ prependTo源码 prepend ...

  4. 立创eda学习笔记二十八:在嘉立创购买pcb板并贴片(smt)

    完整的写一下,分为两部分: 1.下pcb订单 这个可以看之前写的一个博客: 立创eda学习笔记三:pcb购买_Gutie_bartholomew的博客-CSDN博客 补充一下,买pcb可以直接有几个途 ...

  5. Python学习札记(二十八) 模块1

    参考:模块 NOTE 1.模块:一个.py文件称为一个模块. 2.代码模块化的意义:a.提升程序的可维护性 b.不用重复造轮子 3.避免模块冲突,解决方法:引入了按目录来组织模块的方法,称为包(Pac ...

  6. 【Python学习系列二十八】绘图库pyecharts

    网址:https://github.com/chenjiandongx/pyecharts 安装:pip install pyecharts 参考代码: # -*- coding: utf-8 -*- ...

  7. OpenCV学习笔记(十六)——CamShift研究 OpenCV学习笔记(十七)——运动分析和物体跟踪Video OpenCV学习笔记(十八)——图像的各种变换(cvtColor*+)imgproc

    OpenCV学习笔记(十六)--CamShift研究 CamShitf算法,即Continuously Apative Mean-Shift算法,基本思想就是对视频图像的多帧进行MeanShift运算 ...

  8. Python学习笔记第二十九天(N维数组(ndarray))

    Python学习笔记第二十九天 N维数组(ndarray) 构建阵列 索引阵列 ndarray的内部内存布局 阵列属性 内存布局 数据类型 其他属性 阵列接口 ctypes外部功能接口 Array方法 ...

  9. Python学习笔记(十九)面向对象 - 继承

    Python学习笔记(十九)面向对象 - 继承 一.继承的概念 # 继承:子类继承父类的所有方法和属性# 1. 子类 class A(object):def __init__(self):self.n ...

  10. Python学习笔记:Day11 编写日志创建页

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

最新文章

  1. 基于C++Opencv的傅里叶变换代码
  2. springboot使用定时器及发送邮件
  3. 【手写系列】纯手写实现一个高可用的RPC
  4. VS2017更新后 在WIN7上找不到 stdio.h等的问题
  5. 表修改语法之列的增删改
  6. 自己收藏的symantec 需要的拿走
  7. 云原生 | .NET 5 with Dapr 初体验
  8. Coursera自动驾驶课程第13讲:Least Squares
  9. Mybatis(2)---多表查询
  10. Ngnix笔记proxy_set_header设置X-Real-IP(Java获取客户端IP地址)
  11. 数据结构-二叉树、搜索树、平衡二叉树详解及C语言实现
  12. fiddler使用文档
  13. 操作系统关闭透明大页指南
  14. Linux系统中文件颜色分别代表什么?
  15. 黑科技VNET——最好用的Android抓包神器
  16. 机器学习LDA-基础Julia与Python的实现
  17. 入职小米的第三个月是怎样的一种体验?
  18. 64位系统究竟牛逼在哪里?
  19. 双离合档把上按钮作用_大众车自动档档把上的按钮是干什么用的?
  20. K8s学习(15)---DashBoard

热门文章

  1. 【Ubuntu-ROS】ubuntu16.04(18.04)ROS安装配置与卸载
  2. Error(s) in loading state_dict for ResNet 问题解决
  3. 情感分析朴素贝叶斯_朴素贝叶斯推文的情感分析
  4. bert简介_BERT简介
  5. R统计工具:正态性检验
  6. 电脑下面的任务栏怎么取消隐藏_电脑工具栏怎么调到下面
  7. matlab程序中,如何解决矢量长度必须相同的问题
  8. 利用均差的牛顿插值法(Newton)
  9. Vue.js 动态为img的src赋值
  10. AOP集成防止连续多次点击问题