python logging日志模块
一、logging模块的简介
logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具备如下优点:
- 可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息;
- print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging则可以由开发者决定将信息输出到什么地方,以及怎么输出
二、logging模块的机制:
- logger:提供日志接口,供应用代码使用。logger最长用的操作有两类:配置和发送日志消息。可以通过logging.getLogger(name)获取logger对象,如果不指定name则返回root对象,多次使用相同的name调用getLogger方法返回同一个logger对象。
- handler:将日志记录(log record)发送到合适的目的地(destination),比如文件,socket等。一个logger对象可以通过addHandler方法添加0到多个handler,每个handler又可以定义不同日志级别,以实现日志分级过滤显示。
- filter:提供一种优雅的方式决定一个日志记录是否发送到handler。
- formatter:指定日志记录输出的具体格式。formatter的构造方法需要两个参数:消息的格式字符串和日期字符串,这两个参数都是可选的。
三、logging模块的使用,分为一下几步:
1.倒入logging模块
2.配置logging基本的设置(包括:(1.)log的输出路径 (2.)log的输出格式 (3.)log的输出方式 (4.)log的输出内容)
3.实例化一个logging对象(如果不实例化,那么默认实例化对象是root)
4.进行内容的编辑
具体看2个例子:
#!/usr/bin/env/python
# -*-coding:utf-8-*- import logging
logging.basicConfig(level = logging.INFO,format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s') #1.实例化logger记录器对象,记录器的名称叫 appname
logger = logging.getLogger("appname") logger.info("Start print log")
logger.debug("Do something")
logger.warning("Something maybe fail.")
logger.info("Finish") 结果:
2018-08-01 17:52:19,734 - appname - INFO - Start print log
2018-08-01 17:52:19,734 - appname - WARNING - Something maybe fail.
2018-08-01 17:52:19,734 - appname - INFO - Finish
#!/usr/bin/env/python
# -*-coding:utf-8-*- import logging #2.没有实例化的
logging.debug('debug message')
logging.info('info message')
logging.warn('warn message')
logging.error('error message')
logging.critical('critical message') 结果:
WARNING:root:warn message
ERROR:root:error message
CRITICAL:root:critical message
可以看出来,没有对logging进行格式化的话,log的格式是以下图片:
格式化logging的格式是:按照定义的log输出格式来的。
问题来了:为什么第一个例子没有debug的信息,第二个例子没有debug和info的信息?那么我们就要对日志级别进行详细讲解了,看以下的内容。
四、logging的级别详解
级别 | 何时使用 |
DEBUG | 详细信息,调试的时候一步一步看结果时会用,一般可以不用 |
INFO | 证明事情按预期工作,正常运行 |
WARNING | 表明发生了一些意外,或者不久将来会发生的问题(磁盘满了),但是程序还是在正常工作 |
ERROR | 由于更严重的问题,软件已不能执行一些功能了 |
CRITOCAL | 严重错误,表示程序已不能继续运行了 |
如果不设置log的基本配置,那么默认是从warning开始输出,所以第二个例子是没有info和debug的信息。
第一个例子,由于设定了log的输出最低级别level=logging.info,所以第一个例子有info但是没有debug的信息。
五、logging的配置方式
- 显式创建记录器Logger、处理器Handler和格式化器Formatter,并进行相关设置;
- 通过简单方式进行配置,使用basicConfig()函数直接进行配置;
- 通过配置文件进行配置,使用fileConfig()函数读取配置文件;
- 通过配置字典进行配置,使用dictConfig()函数读取配置信息;
- 通过网络进行配置,使用listen()函数进行网络配置。
logging用法解析
1. 初始化 logger = logging.getLogger("endlesscode"),getLogger()方法后面最好加上所要日志记录的模块名字,后面的日志格式中的%(name)s 对应的是这里的模块名字
2. 设置级别 logger.setLevel(logging.DEBUG),Logging中有NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL这几种级别,日志会记录设置级别以上的日志
3. Handler,常用的是StreamHandler和FileHandler,windows下你可以简单理解为一个是console和文件日志,一个打印在CMD窗口上,一个记录在一个文件上
4. formatter,定义了最终log信息的顺序,结构和内容,我喜欢用这样的格式 '[%(asctime)s] [%(levelname)s] %(message)s', '%Y-%m-%d %H:%M:%S',
basicConfig关键字参数
关键字 | 描述 |
---|---|
filename | 创建一个FileHandler,使用指定的文件名,而不是使用StreamHandler。 |
filemode | 如果指明了文件名,指明打开文件的模式(如果没有指明filemode,默认为'a')。 |
format | handler使用指明的格式化字符串。 |
datefmt | 使用指明的日期/时间格式。 |
level | 指明根logger的级别。 |
stream | 使用指明的流来初始化StreamHandler。该参数与'filename'不兼容,如果两个都有,'stream'被忽略。 |
有用的format格式
格式 | 描述 |
---|---|
%(levelno)s | 打印日志级别的数值 |
%(levelname)s | 打印日志级别名称 |
%(pathname)s | 打印当前执行程序的路径 |
%(filename)s | 打印当前执行程序名称 |
%(funcName)s | 打印日志的当前函数 |
%(lineno)d | 打印日志的当前行号 |
%(name)s | Logger的名字 |
%(module)s | 调用日志输出函数的模块名 |
%(created)f | 当前时间,用UNIX标准的表示时间的浮 点数表示 |
%(asctime)s | 打印日志的时间,默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒 |
%(thread)d | 打印线程id |
%(threadName)s | 打印线程名称 |
%(process)d | 打印进程ID |
%(message)s | 打印日志信息 |
#!/usr/bin/env/python
# -*-coding:utf-8-*- import logging #实例化logging对象,实例化的名称叫 appname
logger = logging.getLogger("appname") #建立一个filehandler来把日志以只读的形式记录在文件appLog.md中,级别为debug以上
fh = logging.FileHandler("appLog.md",'w')
fh.setLevel(logging.DEBUG) #建立一个streamhandler来把日志打在cmd窗口上,级别为error以上
sh = logging.StreamHandler()
sh.setLevel(logging.ERROR) #设置日志的格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
sh.setFormatter(formatter) #将相应的handler添加在logger对象中
logger.addHandler(fh)
logger.addHandler(sh) #开始打印信息
logger.info("Start print log")
logger.debug("Do something")
logger.warning("Something maybe fail.")
logger.info("Finish")
logger.error("error")
logger.critical("critical") 结果:
cmd
appLog.md
当一个项目比较大的时候,不同的文件都要用到log,可以烤考虑将其封装为一个类来使用。
#!/usr/bin/env/python
# -*-coding:utf-8-*- import logging class LogTest(object): def __init__(self,path,s_level=logging.DEBUG, f_level=logging.DEBUG):
self.logger = logging.getLogger(path)
self.logger.setLevel(logging.DEBUG) #定义日志格式
fmt = logging.Formatter('[%(asctime)s] [%(levelname)s] %(message)s', '%Y-%m-%d %H:%M:%S')
# 设置写入CMD日志
sh = logging.StreamHandler()
sh.setFormatter(fmt)
sh.setLevel(s_level)
# 设置写入文件日志
fh = logging.FileHandler(path)
fh.setFormatter(fmt)
fh.setLevel(f_level)
#将handle加入logger对象中
self.logger.addHandler(sh)
self.logger.addHandler(fh) def debug(self, message):
self.logger.debug(message) def info(self, message):
self.logger.info(message) def war(self, message):
self.logger.warn(message) def error(self, message):
self.logger.error(message) def cri(self, message):
self.logger.critical(message) if __name__ == '__main__':
logyyx = LogTest('yyx.log', logging.ERROR, logging.DEBUG)
logyyx.debug('一个debug信息')
logyyx.info('一个info信息')
logyyx.war('一个warning信息')
logyyx.error('一个error信息')
logyyx.cri('一个致命critical信息')
如果想在CMD窗口中对于error的日志标红,warning的日志标黄,那么可以使用ctypes模块
#!/usr/bin/env/python
# -*-coding:utf-8-*- import logging
import ctypes FOREGROUND_WHITE = 0x0007
FOREGROUND_BLUE = 0x01 # text color contains blue.
FOREGROUND_GREEN = 0x02 # text color contains green.
FOREGROUND_RED = 0x04 # text color contains red.
FOREGROUND_YELLOW = FOREGROUND_RED | FOREGROUND_GREEN STD_OUTPUT_HANDLE = -11
std_out_handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE) def set_color(color, handle=std_out_handle):
bool = ctypes.windll.kernel32.SetConsoleTextAttribute(handle, color)
return bool class Logger: def __init__(self, path, clevel=logging.DEBUG, Flevel=logging.DEBUG):
self.logger = logging.getLogger(path)
self.logger.setLevel(logging.DEBUG)
fmt = logging.Formatter('[%(asctime)s] [%(levelname)s] %(message)s', '%Y-%m-%d %H:%M:%S')
# 设置CMD日志
sh = logging.StreamHandler()
sh.setFormatter(fmt)
sh.setLevel(clevel)
# 设置文件日志
fh = logging.FileHandler(path)
fh.setFormatter(fmt)
fh.setLevel(Flevel)
self.logger.addHandler(sh)
self.logger.addHandler(fh) def debug(self, message):
self.logger.debug(message) def info(self, message):
self.logger.info(message) def war(self, message, color=FOREGROUND_YELLOW):
set_color(color)
self.logger.warn(message)
set_color(FOREGROUND_WHITE) def error(self, message, color=FOREGROUND_RED):
set_color(color)
self.logger.error(message)
set_color(FOREGROUND_WHITE) def cri(self, message):
self.logger.critical(message) if __name__ == '__main__':
logyyx = Logger('yyx.log', logging.WARNING, logging.DEBUG)
logyyx.debug('一个debug信息')
logyyx.info('一个info信息')
logyyx.war('一个warning信息')
logyyx.error('一个error信息')
logyyx.cri('一个致命critical信息')
python logging日志模块的更多相关文章
- Python logging(日志)模块
python日志模块 内容简介 1.日志相关概念 2.logging模块简介 3.logging模块函数使用 4.logging模块日志流处理流程 5.logging模块组件使用 6.logging配 ...
- python logging 日志模块的配置和使用
import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(line ...
- python 自动化之路 logging日志模块
logging 日志模块 http://python.usyiyi.cn/python_278/library/logging.html 中文官方http://blog.csdn.net/zyz511 ...
- Python入门之logging日志模块以及多进程日志
本篇文章主要对 python logging 的介绍加深理解.更主要是 讨论在多进程环境下如何使用logging 来输出日志, 如何安全地切分日志文件. 1. logging日志模块介绍 python ...
- Python 中 logging 日志模块在多进程环境下的使用
因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,Python 中 logging 日志模块在多进程环境下的使用 使用 Pytho ...
- python中的logging日志模块
日志是程序不可或缺的一部分.它可以记录程序的运行情况,帮助我们更便捷地发现问题,而python中的logging日志模块给我们提供了这个机会. logging给我们提供了五种函数用来输出日志:debu ...
- logging 日志模块学习
logging 日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系统的运行状况进行跟踪,所以还是灰常重要滴,下面我就来从入门到放弃的系统学习一下日志既可以在屏幕上显示,又可以在文件中体现. ...
- logging日志模块
为什么要做日志: 审计跟踪:但错误发生时,你需要清除知道该如何处理,通过对日志跟踪,你可以获取该错误发生的具体环境,你需要确切知道什么是什么引起该错误,什么对该错误不会造成影响. 跟踪应用的警告和错误 ...
- python logging 日志轮转文件不删除问题
前言 最近在维护项目的python项目代码,项目使用了 python 的日志模块 logging, 设定了保存的日志数目, 不过没有生效,还要通过contab定时清理数据. 分析 项目使用了 logg ...
随机推荐
- 老男孩python学习自修第十五天【常用模块之time】
例如: #!/usr/bin/env python # _*_ coding:UTF-8 _*_ import time if __name__ == "__main__": pr ...
- 获取DataSet中某行某列的数据
LabelText = DataSet11.Tables("COMM.USERS").Rows[0]["User_Name"].tostring() Label ...
- WEB相关概念、Tomcat初识、Servlet、基本知识。
/* * 一.web的概念? * 1.web就是在http协议基础之上, 利用浏览器进行访问的网站. * Web Page指网站内的网页. 我们常说的WWW(World Wide Web 万维网)就是 ...
- Python 第三方库 cp27、cp35 等文件名的含义(转)
转自 https://blog.csdn.net/lanchunhui/article/details/62417519 转自 https://stackoverflow.com/questions/ ...
- js 中常用的循环
参考文章: 1.js几种数组遍历方式以及性能分析对比 2.javaScript遍历对象.数组总结 首先是数组中可以使用的 1.for 循环 for (let i = 0; i < xxx.len ...
- .net core 2.0 Redis的基本使用
存Session 先配置`appsetting.json`文件 "ConnectionStrings": { "Redis": "ip:6379,ab ...
- .net core 2.0 配置Session
本文章为原创文章,转载请注明出处 配置Session 在Startup.cs文件的ConfigureServices方法中添加session services.AddSession(); 在Start ...
- BZOJ4712洪水——动态DP+树链剖分+线段树
题目描述 小A走到一个山脚下,准备给自己造一个小屋.这时候,小A的朋友(op,又叫管理员)打开了创造模式,然后飞到 山顶放了格水.于是小A面前出现了一个瀑布.作为平民的小A只好老实巴交地爬山堵水.那么 ...
- BZOJ2463[中山市选2009]谁能赢呢?——博弈论
题目描述 小明和小红经常玩一个博弈游戏.给定一个n×n的棋盘,一个石头被放在棋盘的左上角.他们轮流移动石头.每一回合,选手只能把石头向上,下,左,右四个方向移动一格,并且要求移动到的格子之前不能被访问 ...
- LOJ2251 [ZJOI2017] 树状数组【线段树】【树套树】
题目分析: 对于一个$add$操作,它的特点是与树状数组的查询相同,会给$1$到它自己产生影响,而$query$操作则会途径所有包含它的树状数组点.现在$add$操作具有前向性(不会影响之后的点).所 ...