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")

 

posted @ 2016-06-28 20:00  Snow_man  阅读(114)  评论(0)    收藏  举报