Python之日志处理(logging模块)详解
logging模块简介
logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具备如下优点
1、可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息
2、print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging则可以由开发者决定将信息输出到什么地方,以及怎么输出
日志等级(level)
DEBUG < INFO < WARNING < ERROR < CRITICAL
DEBUG 最详细的日志信息,典型应用场景是 问题诊断
INFO 信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作
WARNING 当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的
ERROR 由于一个更严重的问题导致某些功能不能正常运行时记录的信息
CRITICAL 当发生严重错误,导致应用程序不能继续运行时记录的信息
logging模块可以指定日志记录器的日志级别,只有级别大于或等于该指定日志级别的日志记录才会被输出,小于该等级的日志记录将会被丢弃
logger
logger:日志对象,logging模块中最基础的对象,用logging.getLogger(name)方法进行初始化,name可以不填。通常logger的名字我们对应模块名,如聊天模块、数据库模块、验证模块等
1. 为程序提供记录日志的接口
2. 判断日志所处级别,并判断是否要过滤
3. 根据其日志级别将该条日志分发给不同handler
其常用函数有:
Logger.setLevel() 设置日志级别
Logger.addHandler() 和 Logger.removeHandler() 添加和删除一个Handler
Logger.addFilter() 添加一个Filter
setLevel:设置日志等级
logger=logging.getLogger()
logger.setLevel(logging.DEBUG) #设置日志等级
logging
1、Formatter用于控制日志信息的最终输出格式
logging.Formatter(参数)
formatter=logging.Formatter('[%(asctime)s]-%(filename)s]-%(levelname)s:%(message)s')
%(name)s Logger的名字
%(levelno)s 数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s 调用日志输出函数的模块的文件名
%(module)s 调用日志输出函数的模块名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有
%(process)d 进程ID。可能没有
%(message)s 用户输出的消息
2、Handler基于日志级别对日志进行分发,如设置为WARNING级别的Handler只会处理WARNING及以上级别的日志。具体的应用如一个应用要把所有的日志打在文件中,并把ERROR以上级别的日志打印到屏幕,把CRITICAL级别的日志发邮件
常用函数有:
setLevel() 设置级别
setFormatter() 设置Formatter
logging.FileHandler(参数)创建一个FileHandler
logger.addHandler(fh)添加
logging.StreamHandler()创建一个 StreamHandler
logger.addHandler(ch)添加
# 创建一个FileHandler,用于写到本地
fh=logging.FileHandler(logname,'a',"utf-8")
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
logger.addHandler(fh)
# 创建一个 StreamHandler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setFormatter(formatter)
logger.addHandler(ch)
import os,time,logging
#日志存放路径
log_path=os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))),'logs')
# 如果不存在这个logs文件夹,就自动创建一个
if not os.path.exists(log_path):os.mkdir(log_path)
class Log():def __init__(self):#再日志路径下添加日志文件名self.logname=os.path.join(log_path,'%s.log'%time.strftime('%Y_%m_%d'))#logger日志对象初始化self.logger=logging.getLogger()#设置日志等级self.logger.setLevel(logging.DEBUG)#日志输出格式self.formatter=logging.Formatter('[%(asctime)s]-%(filename)s]-%(levelname)s:%(message)s')def __console(self,level,message):# 创建一个 FileHandler,用于写到本地fh=logging.FileHandler(self.logname,'a',"utf-8")fh.setLevel(logging.DEBUG)fh.setFormatter(self.formatter)self.logger.addHandler(fh)# 创建一个 StreamHandler,用于输出到控制台ch = logging.StreamHandler()ch.setLevel(logging.DEBUG)ch.setFormatter(self.formatter)self.logger.addHandler(ch)if level=='info':self.logger.info(message)elif level=='debug':self.logger.debug(message)elif level=='warning':self.logger.warning(message)elif level=='error':self.logger.error(message)# 这两行代码是为了避免日志输出重复问题self.logger.removeHandler(ch)self.logger.removeHandler(fh)# 关闭打开的文件fh.close()def debug(self, message):self.__console('debug', message)def info(self, message):self.__console('info', message)def warning(self, message):self.__console('warning', message)def error(self, message):self.__console('error', message)
if __name__ == "__main__":log=Log()log.info("---测试开始---")log.info("操作步骤1,2,3")log.warning("---测试结束---")C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py
[2019-04-10 17:17:18,025]-test.py]-INFO:---测试开始---
[2019-04-10 17:17:18,026]-test.py]-INFO:操作步骤1,2,3
[2019-04-10 17:17:18,028]-test.py]-WARNING:---测试结束---Process finished with exit code 0
Python之日志处理(logging模块)详解相关推荐
- Python 标准库之 sys 模块详解
Python sys 模块详解 1. 简介 "sys"即"system","系统"之意.该模块提供了一些接口,用于访问 Python 解释器 ...
- python常用内置模块-Python常用内置模块之xml模块(详解)
xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.从结构上,很像HTML超文本标记语言.但他们被设计的目的是不同的,超文本标记语言被设计用来显示 ...
- Python基础学习之 os 模块详解
Python基础学习之 os 模块详解 文章目录 Python基础学习之 os 模块详解 1. 路径操作 1.1 os.chdir(),切换当前工作目录: 1.2 os.getcwd(),返回工作目录 ...
- python中logging模块详解_python logging日志模块详解
logging 日志模块详解 用Python写代码的时候,在想看的地方写个print xx 就能在控制台上显示打印信息,这样子就能知道它是什么了,但是当我需要看大量的地方或者在一个文件中查看的时候,这 ...
- python logging模块详解_python logging模块使用总结
目录 logging模块 日志级别 CRITICAL 50 ERROR 40 WARNING 30 INFO 20 DEBUG 10 logging.basicConfig()函数中的具体参数含义 f ...
- Python logging模块详解
1.简单的将日志打印到屏幕 import logginglogging.debug('This is debug message') logging.info('This is info messag ...
- Python运维自动化psutil 模块详解(超级详细)
psutil 模块 参考官方文档:https://pypi.org/project/psutil/ 一.psutil简介 psutil是一个开源且跨平台(http://code.google.com/ ...
- Python的日志记录-logging模块的使用
一.日志 1.1什么是日志 日志是跟踪软件运行时所发生的事件的一种方法,软件开发者在代码中调用日志函数,表明发生了特定的事件,事件由描述性消息描述,同时还包含事件的重要性,重要性也称为级别或严重性. ...
- 【Python】之 os.path 模块详解
前言: os.path 模块是系统路径操作模块,但实际的原理可以把它认为是处理包含斜杠("/")和反斜杠("\")字符串的模块,其中,斜杠("/&qu ...
- python的sys模块有什么用_python sys模块详解
Python sys 模块详解 1. 简介 "sys"即"system","系统"之意.该模块提供了一些接口,用于访问 Python 解释器 ...
最新文章
- Multithreading in Java
- shell发送网页邮件
- Spring Security 实战干货:实现自定义退出登录
- @import注解_Spring 注解之@Import 注入的各种花活
- C#为什么多线程控制winform需要用委托?
- 明天mbzuai面试的准备,严阵以待
- uda 3.C++二维向量
- php 小知识随手记 new self() 和new static()作用和区别
- 华为音量键只能调通话_华为新全面屏专利曝光,电源键、音量键都没有
- mysql4.52_phpMyAdmin 4.5.0.2 发布下载,MySQL 管理工具
- SQL错误Duplicate column name 'NAME'名字重复应使用别名
- C#.NET分别以GET和POST方式抓取远程页面
- oracle+调整+表空间,oracle数据库表空间及权限调整示例
- PHP函数: set_time_limit
- 如何查看cudnn当前版本_当前版本的花木兰,如何成为边路战神?
- Linux——shell脚本的基础篇(变量定义、变量种类、变量操作)
- R语言使用pROC包的的plot.roc函数对单变量进行ROC分析并可视化ROC曲线、寻找最佳阈值(threshold、cutoff)、在可视化曲线中添加最佳阈值点
- Android TextView、EditText显示输入法自带表情,记录一下
- 从零搭建若依环境(非分离版)
- 产品打磨日记-给SA交待的任务
热门文章
- Java并发编程实战————对象的组合
- Java 多线程 —— wait 与 notify
- 多线程中 start()和run()方法的区别
- 计算机组成原理r型指令logisim实现_第一章 计算机体系结构
- 单片机实验:外部中断按键
- php url参数时间戳,AJAX GET 请求 URL 最后面缀的那个类似于时间戳的参数是什么啊?...
- 两个字符串的最长公共子序列长度_程序员编程算法,解决文本相似度问题的最长公共子序列算法!...
- 基础练习 FJ的字符串 递推 C++
- java.rmi.server.port_java.rmi.server.ExportException: internal error: ObjID already in use报错处理...
- linuxpgrepgrep_linux命令:ps pstree pgrep pidof进程管理