一、logging模块介绍

  logging是Python中自带的标准模块,是Python中用来操作日志的模块。

1、控制台输出日志

 import logging
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,最低级别的日志,那么所有的日志都会打印。
  上面的只是在控制台打印日志,并没有把日志写在文件里面,一般我们都会把日志写在日志文件里面,也很简单,只需要加个参数指定文件名就行了。

2、把日志存入日志文件

  要把日志存入日志文件,需要加上filename参数(即日志文件名)以及filemode参数(写日志模式w为覆盖,a为追加),没有加filename参数时,控制台会输出日志信息,加了filename参数后,控制台不会再输出日志信息。

 import logging
# 没有加filename参数时,控制台有输出日志信息,加了filename参数时,控制台不会再输出日志信息
logging.basicConfig(level=logging.ERROR, # 打印的日志级别
filename='my.log', # 日志文件名
filemode='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级别,一般用来打印一些致命的错误信息')

运行后发现能够生成日志文件,但日志文件里面的中文显示为乱码,且控制台不再打印日志信息。

 # 可以指定日志的输出格式format,这个参数可以输出很多有用的信息,如下面的几种格式:
# % (levelno)s: # 打印日志级别的数值
# % (levelname)s: # 打印日志级别名称
# % (pathname)s: # 打印当前执行程序的路径,其实就是sys.argv[0]
# % (filename)s: # 打印当前执行程序名
# % (funcName)s: # 打印日志的当前函数
# % (lineno)d: # 打印日志的当前行号
# % (asctime)s: # 打印日志的时间
# % (thread)d: # 打印线程ID
# % (threadName)s: # 打印线程名称
# % (process)d: # 打印进程ID
# % (message)s: # 打印日志信息
# 常用格式:
# format = '%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'
# 这个格式可以输出日志的打印时间,是哪个文件第几行输出的,输出的日志级别是什么,以及输入的日志内容。

3、同时实现控制台输出日志、写入日志文件

  logging模块中主要有4个类,分别负责不同的工作:

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

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

        后面两种需要导入handlers,from logging import handlers

        a、StreamHandler 控制台输出

        b、FileHandler 文件输出

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

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

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

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

  具体怎么实现呢?得有个办公室,里面放两个人,一个负责往控制台输出日志,一个负责将日志写入日志文件。

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

 二、封装写日志的类

 # 封装写日志的类
import logging
from logging import handlers
class MyLogger():
def __init__(self,file_name,level='info',backCount=5,when='D'):
logger = logging.getLogger() # 先实例化一个logger对象,先创建一个办公室
logger.setLevel(self.get_level(level)) # 设置日志级别
ch = logging.StreamHandler() # 负责往控制台输出日志
bh = handlers.TimedRotatingFileHandler(filename=file_name,when=when,interval=1,backupCount=backCount,encoding='utf-8')
formater = logging.Formatter('%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')
ch.setFormatter(formater) # 设置控制台输出的日志格式
bh.setFormatter(formater) # 设置文件里面写入的日志格式
logger.addHandler(ch) # 把把用于控制台输出的实例放入logger
logger.addHandler(bh) # 把用于写文件的实例放入logger
self.logger = logger
def get_level(self,str): # 该函数把输入的字符串转换成日志级别(debug转换成logging.DEBUG)
level = {
'debug':logging.DEBUG,
'info':logging.INFO,
'waring':logging.WARNING,
'error':logging.ERROR,
'critical':logging.CRITICAL
}
str = str.lower()
return level.get(str) mylog = MyLogger('my.log','debug')
mylog.logger.warning('waring级别日志')

三、第三方模块nnlog

  直接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级别')

Python学习之==>日志模块的更多相关文章

  1. Python学习 Part4:模块

    Python学习 Part4:模块 1. 模块是将定义保存在一个文件中的方法,然后在脚本中或解释器的交互实例中使用.模块中的定义可以被导入到其他模块或者main模块. 模块就是一个包含Python定义 ...

  2. python学习之argparse模块

    python学习之argparse模块 一.简介: argparse是python用于解析命令行参数和选项的标准模块,用于代替已经过时的optparse模块.argparse模块的作用是用于解析命令行 ...

  3. Python 中 logging 日志模块在多进程环境下的使用

    因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,Python 中 logging 日志模块在多进程环境下的使用 使用 Pytho ...

  4. python的logging日志模块(一)

    最近修改了项目里的logging相关功能,用到了Python标准库里的logging模块,在此做一些记录.主要是从官方文档和stackoverflow上查询到的一些内容. 官方文档 技术博客 基本用法 ...

  5. Python学习day19-常用模块之re模块

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  6. Python学习day18-常用模块之NumPy

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  7. python原生的日志模块

    Python中有个logging模块可以完成相关信息的记录,在debug时用它往往事半功倍 1. 日志级别 日志一共分成5个等级,从低到高分别是: DEBUG INFO WARNING ERROR C ...

  8. Python学习笔记-常用模块

    1.python模块 如果你退出 Python 解释器并重新进入,你做的任何定义(变量和方法)都会丢失.因此,如果你想要编写一些更大的程序,为准备解释器输入使用一个文本编辑器会更好,并以那个文件替代作 ...

  9. python学习之random模块

    Python中的random模块用于生成随机数.下面介绍一下random模块中最常用的几个函数. random.random random.random()用于生成一个0到1的随机符点数: 0 < ...

随机推荐

  1. C++ 一周刷完C++基础课程(同C程序进行比较)

    **参考bilibili视频av29504365** ### 一段简单的程序Hello World```#include <iostream>using namespace std;int ...

  2. LVM介绍及相关操作

    一.逻辑卷管理器介绍 逻辑卷管理器(英语:Logical Volume Manager,缩写为LVM),又译为逻辑卷宗管理器.逻辑扇区管理器.逻辑磁盘管理器,是Linux核心所提供的逻辑卷管理(Log ...

  3. 【洛谷P2292】L语言

    题目大意:给定一个长度为 N 的字符串和一个字典,字典中所有的字符串的长度均不超过 10,求给定的字符串从前往后最多有多少位可以与字典匹配. 题解:设 \(dp[i]\) 表示串的前 i 位是否能够与 ...

  4. pandas Series和dataframe

    DataFrame是一个表格型数据结构,与Series不同的是,DataFrame可以含有一组或者有序的列,每列可以使不同的值的类型,它可以被看做成Series的字典.

  5. C++ 没有合适的默认构造函数(无参数构造函数)

    本来今天吧,想写一个proxy class的范例,写着写着出了个问题,见如下代码 ; Array1D* _elemArray = new Array1D[_cap]; 同时我为Array1D这个类写了 ...

  6. net core 返回值

    //指定类下的子类 Type helloType = typeof(ActionResult); List<Type> types = new List<Type>(); fo ...

  7. Linux培训教程 浅谈:PHP在linux上执行外部命令(整理)

    一.PHP中调用外部命令介绍 二.关于安全问题 三.关于超时问题 四.关于PHP运行linux环境中命令出现的问题 一.PHP中调用外部命令介绍 在PHP中调用外部命令,可以用,1>调用专门函数 ...

  8. 【BZOJ3931】[CQOI2015]网络吞吐量

    Description 路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器.为了使数据包最快的到达目的地,路由器需要选择 ...

  9. 拦截器中,request中getReader()和getInputStream()只能调用一次,构建可重复读取inputStream的request.

    由于 request中getReader()和getInputStream()只能调用一次 在项目中,可能会出现需要针对接口参数进行校验等问题. 因此,针对这问题,给出一下解决方案 实现方法:先将Re ...

  10. Vue中基本指令用法

    指令在Vue中是个很重要的功能,在Vue项目中是必不可少的.根据官网的介绍,指令 (Directives) 是带有 v- 前缀的特殊属性.指令的职责是,当表达式的值改变时,将其产生的连带影响,响应式地 ...