Python基础知识——模块详解三
configParser模块
创建配置文档:
import configparser config = configparser.ConfigParser() config['DEFAULT'] = {'name':'Jone', 'age':'33', 'sex':'male'} config['Job'] = {} config['Job']['First'] = 'Cleaner' config['Family'] = {} family = config['Family'] family['wife'] = 'Jane' family['son'] = 'Jack' config['DEFAULT']['Condition'] = 'Rich' with open('example.ini', 'w') as configfile: config.write(configfile) f = open('example.ini') print(f.read()) f.close() 运行结果: C:\Users\Clingyu\Desktop>python 1.py [DEFAULT] name = Jone age = 33 sex = male condition = Rich [Job] first = Cleaner [Family] wife = Jane son = Jack
配置文件的读取:
>>> import configparser >>> config = configparser.ConfigParser() >>> config.read('example.ini') ['example.ini'] >>> config.sections() #查看标题 ['Job', 'Family'] >>> config.options('Job') #查看标题中的项 ['first', 'name', 'age', 'sex', 'condition'] >>> config.options('Family') ['wife', 'son', 'name', 'age', 'sex', 'condition'] >>> config.items('Job') #查看标题中的项,(key, item)格式 [('name', 'Jone'), ('age', '33'), ('sex', 'male'), ('condition', 'Rich'), ('first', 'Cleaner')] >>> config.get('Job', 'name') #获得字符串的值 'Jone' >>> config.getint('Job', 'age') #获得整数值 33 >>> config.getfloat('Job', 'age') #获得浮点数值 33.0 注:默认标题不会在标题列表中显示出来,但是他的项,共享于所有标题
配置文件的修改:
import configparser config = configparser.ConfigParser() config.read('example.ini') #删除标题 config.remove_section('Job') #删除标题下的某项 config.remove_option('DEFAULT', 'Condition') #判断标题是否存在 print(config.has_section('Family')) #判断标题下是否有某项 print(config.has_option('DEFAULT', 'Condition')) #添加标题 config.add_section('Partime') #添加项 config.set('Partime', 'test', '111') #写入文件,完成修改 config.write(open('example.ini', 'w')) with open('example.ini') as f: print(f.read()) 运行结果: C:\Users\Clingyu\Desktop>python 1.py True False [DEFAULT] name = Jone age = 33 sex = male [Family] wife = Jane son = Jack [Partime] test = 111
logging模块
Python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志
日志分为五个级别:
debug:问题诊断时的详细信息, 10
info:确认事情按预期工作, 20
warning:意料之外的事情或者不久的将来的某些问题, 30
error:由于一些错误,程序的部分功能无法运行, 40
critical:由于严重的错误, 程序无法运行, 50
日志的基本使用方法:
import logging #配置日志的生成格式 logging.basicConfig(level = logging.DEBUG, format = '%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt = '%a, %d %b %Y %H:%M:%S', filename = 'test.log', filemode = 'a') logging.debug('debug') logging.info('info') logging.warning('warning') logging.error('error') logging.critical('critical') with open('test.log') as f: print(f.read()) 运行结果: C:\Users\Clingyu\Desktop>python 1.py Fri, 06 Oct 2017 22:47:20 1.py[line:1549] DEBUG debug Fri, 06 Oct 2017 22:47:20 1.py[line:1550] INFO info Fri, 06 Oct 2017 22:47:20 1.py[line:1551] WARNING warning Fri, 06 Oct 2017 22:47:20 1.py[line:1552] ERROR error Fri, 06 Oct 2017 22:47:20 1.py[line:1553] CRITICAL critical
logging模块通过basicConfig()函数来配置日志的生成格式:
filename:用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中。
filemode:文件打开方式,在指定了filename时使用这个参数,默认值为'a'还可指定为'w'。
format:指定handler使用的日志显示格式。
datefmt:指定日期时间格式。
level:设置rootlogger的日志级别,默认为logging.WARNING
stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。
format参数中可能用到的格式化串:
%(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 用户输出的消息
logging模块详细使用介绍:
import logging logger = logging.getLogger() #创建logger对象, 默认为root # 创建一个handler,用于写入日志文件 fh = logging.FileHandler('test.log') # 再创建一个handler,用于输出到控制台 ch = logging.StreamHandler() #自定义日志输出格式, #formatter对象 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') #将格式导入handler fh.setFormatter(formatter) ch.setFormatter(formatter) # 定义一个filter对象 filter = logging.Filter('mylogger') #过滤器对象导入handler fh.addFilter(filter) ch.addFilter(filter) # 在logger对象中添加handler logger.addHandler(fh) logger.addHandler(ch) # 设置日志输出默认等级 logger.setLevel(logging.DEBUG) logger.debug('logger debug message') logger.info('logger info message') logger.warning('logger warning message') logger.error('logger error message') logger.critical('logger critical message') ################################################## # 新建两个mylogger logger对象 logger1 = logging.getLogger('mylogger') logger1.setLevel(logging.DEBUG) logger2 = logging.getLogger('mylogger') logger2.setLevel(logging.INFO) logger1.addHandler(fh) logger1.addHandler(ch) logger2.addHandler(fh) logger2.addHandler(ch) # 输出信息: logger1.debug('logger1 debug message') logger1.info('logger1 info message') logger1.warning('logger1 warning message') logger1.error('logger1 error message') logger1.critical('logger1 critical message') logger2.debug('logger2 debug message') logger2.info('logger2 info message') logger2.warning('logger2 warning message') logger2.error('logger2 error message') logger2.critical('logger2 critical message') 运行结果: C:\Users\Clingyu\Desktop>python 1.py 2017-10-06 23:02:27,734 - mylogger - INFO - logger1 info message 2017-10-06 23:02:27,734 - mylogger - INFO - logger1 info message 2017-10-06 23:02:27,737 - mylogger - WARNING - logger1 warning message 2017-10-06 23:02:27,737 - mylogger - WARNING - logger1 warning message 2017-10-06 23:02:27,738 - mylogger - ERROR - logger1 error message 2017-10-06 23:02:27,738 - mylogger - ERROR - logger1 error message 2017-10-06 23:02:27,739 - mylogger - CRITICAL - logger1 critical message 2017-10-06 23:02:27,739 - mylogger - CRITICAL - logger1 critical message 2017-10-06 23:02:27,740 - mylogger - INFO - logger2 info message 2017-10-06 23:02:27,740 - mylogger - INFO - logger2 info message 2017-10-06 23:02:27,740 - mylogger - WARNING - logger2 warning message 2017-10-06 23:02:27,740 - mylogger - WARNING - logger2 warning message 2017-10-06 23:02:27,741 - mylogger - ERROR - logger2 error message 2017-10-06 23:02:27,741 - mylogger - ERROR - logger2 error message 2017-10-06 23:02:27,742 - mylogger - CRITICAL - logger2 critical message 2017-10-06 23:02:27,742 - mylogger - CRITICAL - logger2 critical message
Python的logging模块主要有四个类:
logger:提供了应用程序可以直接使用的接口
handler:将logger对象创建的日志记录发送到合适的目的地输出
filter:提供了过滤设备决定了输出哪条日志记录
formatter:决定日志记录的最终输出格式
logger:
日志在输出之前都需要设置一个logger对象:
logging.getLogger(name = None)函数,返回一个logger对象,name参数未设置则默认为root
logger.setLevel(level):指定最低的日志级别,低于level的级别将不被输出。
critical > error > warning > info > debug
logger.addFilter(filter)、Logger.removeFilter(filter):添加或删除指定的filter对象,仅用于该logger对象
注: 对于fileter, logger与handler对象分别作处理,logger先,handler后,最后的输出结果由两者共同决定
logger.addHandler(handler)、Logger.removeHandler(handler):增加或删除指定的handler对象,决定日志输出的途径
logger.debug(message)、logger.info(message)、logger.warning(message)、logger.error(message)、logger.critical(message):输出的日志级别以及日志的信息
handler:
handler对象负责发送相关的信息到指定目的地。
Python的日志系统有多种Handler可以使用, 有些Handler可以把信息输出到控制台,有些Logger可以把信息输出到文件,还有些 Handler可以把信息发送到网络上。
如果觉得不够用,还可以编写自己的Handler。
可以通过addHandler()方法添加多个handler。
handler.setLevel(level):指定被处理的信息级别,低于lel级别的信息将被忽略,日志输出的第一级过滤,过滤规则同filter对象
handler.setFormatter():设定日志的输出格式
handler.addFilter(filter)、handler.removeFilter(filter):新增或删除一个filter对象
常用的handler:
logging.StreamHandler([strm]): 向类似与sys.stdout或者sys.stderr的任何文件对象(file object)输出信息, 参数默认为sys.stderr
logging.FileHandler(filename[,mode]): 向一个文件输出日志信息, 不过FileHandler会帮你打开这个文件。mode默认为'a'
logging.handlers.RotatingFileHandler(filename[, mode[, maxBytes[, backupCount]]]):
>类似于上面的FileHandler,但是它可以管理文件大小。当文件达到一定大小之后,它会自动将当前日志文件改名,然后创建一个新的同名日志文件继续输出
>比如日志文件是chat.log。
>当chat.log达到指定的大小之后,RotatingFileHandler自动把文件改名为chat.log.1。
>不过,如果chat.log.1已经存在,会先把chat.log.1重命名为chat.log.2
>最后重新创建 chat.log,继续输出日志信息。
>maxBytes用于指定日志文件的最大文件大小。如果maxBytes为0,意味着日志文件可以无限大,这时上面描述的重命名过程就不会发生。
>backupCount用于指定保留的备份文件的个数。比如,如果指定为2,当上面描述的重命名过程发生时,原有的chat.log.2并不会被更名,而是被删除。
logging.handlers.TimedRotatingFileHandler(filename [,when [,interval [,backupCount]]]):
>这个Handler和RotatingFileHandler类似
>不过,它没有通过判断文件大小来决定何时重新创建日志文件,而是间隔一定时间就自动创建新的日志文件
>重命名的过程与RotatingFileHandler类似,不过新的文件不是附加数字,而是当前时间。
>interval是时间间隔。
>when参数是一个字符串。表示时间间隔的单位,不区分大小写。它有以下取值:
>S 秒、 M 分、 H 小时、 D 天、 W 每星期(interval==0时代表星期一)、 midnight 每天凌晨
filter与fomatter类的使用如上述代码所示
示例代码解释:
问题一:logger1和logger2设置了不同的Level,输出结果却一致
答:logger1与logger2同为mylogger对象,一个mylogger对象只有一个level配置,所以logger1和logger2配置的是同一个内容,最终以最后修改的为准
问题二:为什么每个日志输出了两次
答:logger对象是树状结构,根节点就是默认设置的root,随后设置的mylogger对象就为root的子节点,在输出处理时,子节点会将任务交给父节点处理,由于这个程序中root对象也配置了handler对象,所以可以输出日志
同时,子节点还可以集成父节点的所有配置,在子节点未配置的情况下,一切同父节点相同
树结构示例:
import logging # 创建一个logger logger = logging.getLogger() logger1 = logging.getLogger('mylogger') logger1.setLevel(logging.DEBUG) logger2 = logging.getLogger('mylogger') logger2.setLevel(logging.INFO) logger3 = logging.getLogger('mylogger.child1') logger3.setLevel(logging.WARNING) logger4 = logging.getLogger('mylogger.child1.child2') logger4.setLevel(logging.DEBUG) logger5 = logging.getLogger('mylogger.child1.child2.child3') logger5.setLevel(logging.DEBUG) # 创建一个handler,用于写入日志文件 fh = logging.FileHandler('test.log') # 再创建一个handler,用于输出到控制台 ch = logging.StreamHandler() # 定义handler的输出格式formatter formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') fh.setFormatter(formatter) ch.setFormatter(formatter) #定义一个filter #filter = logging.Filter('mylogger.child1.child2') #fh.addFilter(filter) # 给logger添加handler #logger.addFilter(filter) logger.addHandler(fh) logger.addHandler(ch) #logger1.addFilter(filter) logger1.addHandler(fh) logger1.addHandler(ch) logger2.addHandler(fh) logger2.addHandler(ch) #logger3.addFilter(filter) logger3.addHandler(fh) logger3.addHandler(ch) #logger4.addFilter(filter) logger4.addHandler(fh) logger4.addHandler(ch) logger5.addHandler(fh) logger5.addHandler(ch) # 记录一条日志 logger.debug('logger debug message') logger.info('logger info message') logger.warning('logger warning message') logger.error('logger error message') logger.critical('logger critical message') logger1.debug('logger1 debug message') logger1.info('logger1 info message') logger1.warning('logger1 warning message') logger1.error('logger1 error message') logger1.critical('logger1 critical message') logger2.debug('logger2 debug message') logger2.info('logger2 info message') logger2.warning('logger2 warning message') logger2.error('logger2 error message') logger2.critical('logger2 critical message') logger3.debug('logger3 debug message') logger3.info('logger3 info message') logger3.warning('logger3 warning message') logger3.error('logger3 error message') logger3.critical('logger3 critical message') logger4.debug('logger4 debug message') logger4.info('logger4 info message') logger4.warning('logger4 warning message') logger4.error('logger4 error message') logger4.critical('logger4 critical message') logger5.debug('logger5 debug message') logger5.info('logger5 info message') logger5.warning('logger5 warning message') logger5.error('logger5 error message') logger5.critical('logger5 critical message') 运行结果: C:\Users\Clingyu\Desktop>python 1.py 2017-10-06 23:51:16,667 - root - WARNING - logger warning message 2017-10-06 23:51:16,670 - root - ERROR - logger error message 2017-10-06 23:51:16,671 - root - CRITICAL - logger critical message 2017-10-06 23:51:16,671 - mylogger - INFO - logger1 info message 2017-10-06 23:51:16,671 - mylogger - INFO - logger1 info message 2017-10-06 23:51:16,672 - mylogger - WARNING - logger1 warning message 2017-10-06 23:51:16,672 - mylogger - WARNING - logger1 warning message 2017-10-06 23:51:16,673 - mylogger - ERROR - logger1 error message 2017-10-06 23:51:16,673 - mylogger - ERROR - logger1 error message 2017-10-06 23:51:16,673 - mylogger - CRITICAL - logger1 critical message 2017-10-06 23:51:16,673 - mylogger - CRITICAL - logger1 critical message 2017-10-06 23:51:16,674 - mylogger - INFO - logger2 info message 2017-10-06 23:51:16,674 - mylogger - INFO - logger2 info message 2017-10-06 23:51:16,674 - mylogger - WARNING - logger2 warning message 2017-10-06 23:51:16,674 - mylogger - WARNING - logger2 warning message 2017-10-06 23:51:16,675 - mylogger - ERROR - logger2 error message 2017-10-06 23:51:16,675 - mylogger - ERROR - logger2 error message 2017-10-06 23:51:16,676 - mylogger - CRITICAL - logger2 critical message 2017-10-06 23:51:16,676 - mylogger - CRITICAL - logger2 critical message 2017-10-06 23:51:16,676 - mylogger.child1 - WARNING - logger3 warning message 2017-10-06 23:51:16,676 - mylogger.child1 - WARNING - logger3 warning message 2017-10-06 23:51:16,676 - mylogger.child1 - WARNING - logger3 warning message 2017-10-06 23:51:16,677 - mylogger.child1 - ERROR - logger3 error message 2017-10-06 23:51:16,677 - mylogger.child1 - ERROR - logger3 error message 2017-10-06 23:51:16,677 - mylogger.child1 - ERROR - logger3 error message 2017-10-06 23:51:16,678 - mylogger.child1 - CRITICAL - logger3 critical message 2017-10-06 23:51:16,678 - mylogger.child1 - CRITICAL - logger3 critical message 2017-10-06 23:51:16,678 - mylogger.child1 - CRITICAL - logger3 critical message 2017-10-06 23:51:16,679 - mylogger.child1.child2 - DEBUG - logger4 debug message 2017-10-06 23:51:16,679 - mylogger.child1.child2 - DEBUG - logger4 debug message 2017-10-06 23:51:16,679 - mylogger.child1.child2 - DEBUG - logger4 debug message 2017-10-06 23:51:16,679 - mylogger.child1.child2 - DEBUG - logger4 debug message 2017-10-06 23:51:16,680 - mylogger.child1.child2 - INFO - logger4 info message 2017-10-06 23:51:16,680 - mylogger.child1.child2 - INFO - logger4 info message 2017-10-06 23:51:16,680 - mylogger.child1.child2 - INFO - logger4 info message 2017-10-06 23:51:16,680 - mylogger.child1.child2 - INFO - logger4 info message 2017-10-06 23:51:16,682 - mylogger.child1.child2 - WARNING - logger4 warning message 2017-10-06 23:51:16,682 - mylogger.child1.child2 - WARNING - logger4 warning message 2017-10-06 23:51:16,682 - mylogger.child1.child2 - WARNING - logger4 warning message 2017-10-06 23:51:16,682 - mylogger.child1.child2 - WARNING - logger4 warning message 2017-10-06 23:51:16,683 - mylogger.child1.child2 - ERROR - logger4 error message 2017-10-06 23:51:16,683 - mylogger.child1.child2 - ERROR - logger4 error message 2017-10-06 23:51:16,683 - mylogger.child1.child2 - ERROR - logger4 error message 2017-10-06 23:51:16,683 - mylogger.child1.child2 - ERROR - logger4 error message 2017-10-06 23:51:16,684 - mylogger.child1.child2 - CRITICAL - logger4 critical message 2017-10-06 23:51:16,684 - mylogger.child1.child2 - CRITICAL - logger4 critical message 2017-10-06 23:51:16,684 - mylogger.child1.child2 - CRITICAL - logger4 critical message 2017-10-06 23:51:16,684 - mylogger.child1.child2 - CRITICAL - logger4 critical message 2017-10-06 23:51:16,685 - mylogger.child1.child2.child3 - DEBUG - logger5 debug message 2017-10-06 23:51:16,685 - mylogger.child1.child2.child3 - DEBUG - logger5 debug message 2017-10-06 23:51:16,685 - mylogger.child1.child2.child3 - DEBUG - logger5 debug message 2017-10-06 23:51:16,685 - mylogger.child1.child2.child3 - DEBUG - logger5 debug message 2017-10-06 23:51:16,685 - mylogger.child1.child2.child3 - DEBUG - logger5 debug message 2017-10-06 23:51:16,686 - mylogger.child1.child2.child3 - INFO - logger5 info message 2017-10-06 23:51:16,686 - mylogger.child1.child2.child3 - INFO - logger5 info message 2017-10-06 23:51:16,686 - mylogger.child1.child2.child3 - INFO - logger5 info message 2017-10-06 23:51:16,686 - mylogger.child1.child2.child3 - INFO - logger5 info message 2017-10-06 23:51:16,686 - mylogger.child1.child2.child3 - INFO - logger5 info message 2017-10-06 23:51:16,687 - mylogger.child1.child2.child3 - WARNING - logger5 warning message 2017-10-06 23:51:16,687 - mylogger.child1.child2.child3 - WARNING - logger5 warning message 2017-10-06 23:51:16,687 - mylogger.child1.child2.child3 - WARNING - logger5 warning message 2017-10-06 23:51:16,687 - mylogger.child1.child2.child3 - WARNING - logger5 warning message 2017-10-06 23:51:16,687 - mylogger.child1.child2.child3 - WARNING - logger5 warning message 2017-10-06 23:51:16,689 - mylogger.child1.child2.child3 - ERROR - logger5 error message 2017-10-06 23:51:16,689 - mylogger.child1.child2.child3 - ERROR - logger5 error message 2017-10-06 23:51:16,689 - mylogger.child1.child2.child3 - ERROR - logger5 error message 2017-10-06 23:51:16,689 - mylogger.child1.child2.child3 - ERROR - logger5 error message 2017-10-06 23:51:16,689 - mylogger.child1.child2.child3 - ERROR - logger5 error message 2017-10-06 23:51:16,690 - mylogger.child1.child2.child3 - CRITICAL - logger5 critical message 2017-10-06 23:51:16,690 - mylogger.child1.child2.child3 - CRITICAL - logger5 critical message 2017-10-06 23:51:16,690 - mylogger.child1.child2.child3 - CRITICAL - logger5 critical message 2017-10-06 23:51:16,690 - mylogger.child1.child2.child3 - CRITICAL - logger5 critical message 2017-10-06 23:51:16,690 - mylogger.child1.child2.child3 - CRITICAL - logger5 critical message #显然在所有节点都配置handler对象的情况下,子节点的层次越低,输出日志次数越多,只要将父节点的handler对象取消,则就只会输出一次
示例:
my_logging.py """ logging配置 """ import os import logging.config # 定义三种日志输出格式 开始 standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \ '[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字 simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s' id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s' # 定义日志输出格式 结束 logfile_dir = os.path.dirname(os.path.abspath(__file__)) # log文件的目录 logfile_name = 'test.log' # log文件名 # 如果不存在定义的日志目录就创建一个 if not os.path.isdir(logfile_dir): os.mkdir(logfile_dir) # log文件的全路径 logfile_path = os.path.join(logfile_dir, logfile_name) # log配置字典 LOGGING_DIC = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'standard': { 'format': standard_format }, 'simple': { 'format': simple_format }, }, 'filters': {}, 'handlers': { #打印到终端的日志 'console': { 'level': 'DEBUG', 'class': 'logging.StreamHandler', # 打印到屏幕 'formatter': 'simple' }, #打印到文件的日志,收集info及以上的日志 'default': { 'level': 'DEBUG', 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件 'formatter': 'standard', 'filename': logfile_path, # 日志文件 'maxBytes': 1024*1024*5, # 日志大小 5M 'backupCount': 5, 'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了 }, }, 'loggers': { #logging.getLogger(__name__)拿到的logger配置 '': { 'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕 'level': 'DEBUG', 'propagate': True, # 向上(更高level的logger)传递 }, }, } def load_my_logging_cfg(): logging.config.dictConfig(LOGGING_DIC) # 导入上面定义的logging配置 logger = logging.getLogger(__name__) # 生成一个log实例 logger.info('It works!') # 记录该文件的运行状态 if __name__ == '__main__': load_my_logging_cfg()
test.py """ MyLogging Test """ import time import logging import my_logging # 导入自定义的logging配置 logger = logging.getLogger(__name__) # 生成logger实例 def demo(): logger.debug("start range... time:{}".format(time.time())) logger.info("中文测试开始。。。") for i in range(10): logger.debug("i:{}".format(i)) time.sleep(0.2) else: logger.debug("over range... time:{}".format(time.time())) logger.info("中文测试结束。。。") if __name__ == "__main__": my_logging.load_my_logging_cfg() # 在你程序文件的入口加载自定义logging配置 demo() 运行结果: C:\Users\Clingyu\Desktop>python 1.py [INFO][2017-10-06 22:36:30,955][my_logging.py:75]It works! [DEBUG][2017-10-06 22:36:30,958][1.py:1525]start range... time:1507300590.9583492 [INFO][2017-10-06 22:36:30,959][1.py:1526]中文测试开始。。。 [DEBUG][2017-10-06 22:36:30,959][1.py:1528]i:0 [DEBUG][2017-10-06 22:36:31,160][1.py:1528]i:1 [DEBUG][2017-10-06 22:36:31,361][1.py:1528]i:2 [DEBUG][2017-10-06 22:36:31,562][1.py:1528]i:3 [DEBUG][2017-10-06 22:36:31,763][1.py:1528]i:4 [DEBUG][2017-10-06 22:36:31,980][1.py:1528]i:5 [DEBUG][2017-10-06 22:36:32,187][1.py:1528]i:6 [DEBUG][2017-10-06 22:36:32,388][1.py:1528]i:7 [DEBUG][2017-10-06 22:36:32,589][1.py:1528]i:8 [DEBUG][2017-10-06 22:36:32,790][1.py:1528]i:9 [DEBUG][2017-10-06 22:36:32,991][1.py:1531]over range... time:1507300592.9914656 [INFO][2017-10-06 22:36:32,992][1.py:1532]中文测试结束。。。

浙公网安备 33010602011771号