Python之路Day8
logging线程安全模块(日志记录是软件中必不可少的功能,它能记录系统运行状态,帮助技术人员定位问题。logging是python自带的日志模块。这里梳理一下这个用法。)
函数格式
logging.basicConfig(filename = $日志路径,level = $日志级别, format = $日志格式, datefmt = $时间格式)
logging模块中的日志分为5个级别, 从高到低依次是:CRITICAL > ERROR > WARNING > INFO > DEBUG.设置了日志级别之后,低于该级别的日志将会被忽略。
import logging logging.basicConfig(filename='log.log', format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S %p', level=logging.INFO,) logging.debug('debug') logging.info('info') logging.warning('warning') logging.error('error') logging.critical('nihaoa') logging.log(logging.INFO,'5555')
日志格式:
| 说明 | 属性名 | 格式 |
| 打印当前时间,默认会展示2003-07-08 16:49:45,896,精度会精确到千分之一秒。 | asctime | %(asctime)s |
| 打印当前的时间戳(time.time()函数的返回值) | created | %(created)f |
| 打印当前文件名。 | filename | %(filename)s |
| 打印当前函数名。 | funcName | %(funcName)s |
| 本条日志的日志级别 (‘DEBUG’, ‘INFO’, ‘WARNING’, ‘ERROR’,’CRITICAL’). | levelname | %(levelname)s |
| 日志级别的整型值 (DEBUG, INFO, WARNING, ERROR,CRITICAL). | levelno | %(levelno)s |
| 打印日志的代码在文件中的行号 (if available). | lineno | %(lineno)d |
| 打印当前的模块名。 | module | %(module)s |
| 打印当前时间的毫秒部分。 | msecs | %(msecs)d |
| 当前的日志内容。 | message | %(message)s |
| 当前日志的对象的name。 | name | %(name)s |
| 打印当前文件的完整路径名。 | pathname | %(pathname)s |
| 进程号 | process | %(process)d |
| 进程名 | processName | %(processName)s |
| 当前时间与日志对象创建的相对时间,显示为毫秒值 | relativeCreated | %(relativeCreated)d |
| 线程ID | thread | %(thread)d |
| 线程名 | threadName | %(threadName)s |
基本元素说明:
- Logger:用于输出的日志的总对象
- Handlers:用来指定log的输出方式
- Formatters:设置日志信息的结构和内容格式,默认的时间格式为%Y-%m-%d %H:%M:%S
- Filter:过滤器,用来过滤的输出内容(如:只输出debug以上的内容)
Logger
常用函数
- LOG=logging.getLogger(”chat.gui”)
- Logger.setLevel(lel):指定最低的日志级别,低于lel的级别将被忽略。debug是最低的内置级别,critical为最高
- Logger.addFilter(filt)、Logger.removeFilter(filt):添加或删除指定的filter
- Logger.addHandler(hdlr)、Logger.removeHandler(hdlr):增加或删除指定的handler
- Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical():可以设置的日志级别
- Logger.log(“debug”,”This is a bug”):可以通过这个函数直接输出内容并选择对应的告警级别
Handlers
1.常用函数
- Handler.setLevel(lel):指定被处理的信息级别,低于lel级别的信息将被忽略
- Handler.setFormatter():给这个handler选择一个格式
- Handler.addFilter(filt)、Handler.removeFilter(filt):新增或删除一个filter对象
#多文件日志 import logging file_1_1 = logging.FileHandler('11_.log','a') fmt = logging.Formatter(fmt='%(actime)s - %(name)s - %(leve(name)s - %(module)s: %(message)s') file_1_1.setFormatter(fmt) file_1_2=logging.FileHandler('11_2.log','a') fmt = logging.Formatter() file_1_2.setFormatter(fmt) logger1 = logging.logger('s1',level = logging.ERROR) logger1.addHandler(file_1_1) logger.addHandler(file_1_2)
生成器yield
理解生成器,我们首先要了解迭代。
#迭代示例 li = [11,22,33,44,55] for x in li: print (x)
#li 就是一个可迭代对象
#可以用for...in ...语法的叫做迭代器
#如果数量太大,把数据都储存在了内存中,这不是我们想要的
那么,生成器首先是可被迭代的,但是 只可以读取它一次,因为生成器并没有把所有的值放在内存中。它是实时的生成数据。

第一次迭代中你的函数会执行,从开始到达 yield 关键字,然后返回 yield 后的值作为第一次迭代的返回值. 然后,每次执行这个函数都会继续执行yield结束的桅子花开始再次循环,再返回那个值,直到没有可以返回的。
如果生成器内部没有定义 yield 关键字,那么这个生成器被认为成空的。这种情况可能因为是循环进行没了,或者是没有满足 if/else 条件。
迭代器
1、访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
2、不能随机访问集合中的某个值,只能从到到尾依次访问
3、访问到一半时不能退回
4、便于循环比较大的数据集合,节省内存
反射
1、通过字符串的形式,导入模块
2、通过字符串的形式,去模块中导入指定的函数,并执行
3、根据字符串的形式去某个模块中寻找东西 getattr
4、根据字符串的形式去某个模块中判断东西是否存在 hasattr
5、根据字符的形式去某个模块中设置东西 setattr
6、根据字符串的形式去某个模块中删除东西 delattr
#普通的方法 from lib import account url = input("请输入Url:") if url.endswith('login'): r = account.login() print(r) elif url.endswith('logout'): r = account.logout() print(r) else: print('404')
#更改一次后的方法 url = input("请输入url:") target_module,target_func= url.split('/') m = __import__("lib.account"+target_module,fromlist=True) if hasattr(m,target_func): target_func = getattr(m,target_func) r = target_func() print(r) else: print("404")
#最终用反射模拟web框架路由器 from lib import account url = input("请输入url:") inp = url.split('/')[-1] if hasattr(account,inp): target_func = getattr(account,inp) r = target_func() print(r) else: print("404")

浙公网安备 33010602011771号