[笔记]Python | 您所在的位置:网站首页 › asctime函数 › [笔记]Python |
一、什么是日志:项目运行的数据记录 二、日志的作用: 1.记录程序执行的过程 2.还原用户的操作 3.可用来定位bug(后端的问题看日志,前端的直接F12) 三、日志收集器 1.用来收集程序输出数据的工具 2.数据格式(包含哪些信息) (1)日志内容 (2)日志级别 [等级由低到高] --debug调试级别:给程序员看的; --info()级别:正常记录程序的执行过程,用来定位bug; --warning警告级别:可能有影响,不是报错; --error级别:报错信息,某个功能出错,但是其他功能还可以用; --critical致命级别:严重错误影响程序运行; (3)输出时间 (4)哪一行代码输出的 (5)日志的格式 (6)日志输出到哪里(控制台、**.log文件) 四、python自带日志收集器 import requests,logging,pprint # logging是python自带的日志收集器,显示信息不够友好,后面会自己写一套 logging.basicConfig(level=logging.DEBUG) #将默认的日志收集器(root)的日志级别改成了debug res = requests.post(url="http://httpbin.org/post",data={"key1":"val1"}) 结果: DEBUG:urllib3.connectionpool:Starting new HTTP connection (1): httpbin.org DEBUG:urllib3.connectionpool:httpbin.org "POST /post HTTP/1.1" 200 479五、自定义日志收集器 以下代码设置了2种渠道,一个是控制台,一个是放在文件里 import requests,logging,pprint from logging import handlers #自定义日志收集器 # 1.创建一个日志收集器 my_log = logging.getLogger(name="mylog") # 2.创建日志渠道 my_qd = logging.StreamHandler() #控制台 # 也可以创建文件渠道,把日志保存在文件中 log_file_qd = handlers.TimedRotatingFileHandler(filename="mylog.log",when='D',interval=2,backupCount=3,encoding='utf-8') '''when代表切割日志的周期 interval 代表多少个周期when,换一个日志文件 backupCount 日志文件保留的最多个数,不写也可以''' # 3.设置日志格式 ''' %(name)s 日志渠道的名称 %(levelno)s 日志级别对应的数字编号 (DEBUG, INFO,WARNING, ERROR, CRITICAL) %(levelname)s 日志级别的文字版 ("DEBUG", "INFO","WARNING", "ERROR", "CRITICAL") %(pathname)s 输出日志的py文件的绝对路径 (名称.py) %(filename)s py文件的名称(名称.py) %(module)s py文件的名称,名称没有后缀 %(lineno)d 输出日志的行数 %(funcName)s 输出日志的函数的名称,不是函数就输出模块名称 %(created)f 日志输出的时间,格式是时间戳 %(asctime)s 日志输出时间,格式:年-月-日 时-分-秒,毫秒 %(msecs)d 毫秒,日志输出时间毫秒级别 %(relativeCreated)d 日志输出相对时间,相对模块加载多久后日志输出,毫秒 %(thread)d 线程ID %(threadName)s 线程名称 %(process)d 进程ID,一个进程可以启动多个线程 %(message)s 日志信息 ''' # 创建日志格式 fmt1 = "%(name)s-- %(asctime)s--%(pathname)s--%(levelno)s--%(levelname)s--%(lineno)d>>>:%(message)s" #中间的连接符写啥都行 my_fmt = logging.Formatter(fmt=fmt1) my_qd.setFormatter(fmt=my_fmt) #将日志格式绑定到日志渠道上 # ---------------------------------------- log_file_qd.setFormatter(fmt=my_fmt) #将日志格式绑定到文件日志渠道上 # 4.日志级别:一般设置在日志收集器上 my_log.setLevel(logging.DEBUG) #可以单独给渠道设置日志级别,但是一定要在收集器日志级别的范围内,也就是收集器范围>渠道范围 log_file_qd.setLevel(logging.INFO) # 5.渠道绑定到收集器 my_log.addHandler(my_qd) # 控制台渠道 # ---------------------------------------- my_log.addHandler(log_file_qd) #将文件渠道绑定到收集器 my_log.debug(msg="测试日志,debug级别") my_log.info(msg="info级别日志")六、封装日志收集器,供其他模块调用 import requests,logging,pprint from logging import handlers def my_log(): #自定义日志收集器 # 1.创建一个日志收集器 my_log = logging.getLogger(name="mylog") # 2.创建日志渠道 my_qd = logging.StreamHandler() # 也可以创建文件渠道,把日志保存在文件中 log_file_qd = handlers.TimedRotatingFileHandler(filename="mylog.log",when='D',interval=2,backupCount=3,encoding='utf-8') # 3.设置日志格式 fmt1 = "%(name)s-- %(asctime)s--%(pathname)s--%(levelno)s--%(levelname)s--%(lineno)d>>>:%(message)s" #中间的连接符写啥都行 my_fmt = logging.Formatter(fmt=fmt1) my_qd.setFormatter(fmt=my_fmt) #将日志格式绑定到日志渠道上 # ---------------------------------------- log_file_qd.setFormatter(fmt=my_fmt) #将日志格式绑定到文件日志渠道上 # 4.日志级别:一般设置在日志收集器上 my_log.setLevel(logging.DEBUG) #可以单独给渠道设置日志级别,但是一定要在收集器日志级别的范围内,也就是收集器范围>渠道范围 log_file_qd.setLevel(logging.INFO) # 5.渠道绑定到收集器 my_log.addHandler(my_qd) # 控制台渠道 # ---------------------------------------- my_log.addHandler(log_file_qd) #将文件渠道绑定到收集器 return my_log Logs = my_log() ''' 延伸:为什么要在此处实例化? 如果在其他文件实例化,就存在不同文件都各自创建收集器的情况,导致日志被不同的收集器反复打印 '''其他模块调用 from file import Logs Logs.info("我是其他文件调用的日志,info") |
CopyRight 2018-2019 实验室设备网 版权所有 |