logging/re - 总结
logging 模块
很多程序都有记录日志的需求
logging的日志可以分为 debug(), info(), warning(), error() and critical()5个级别
1.输出到屏幕上
import logging #输出到屏幕上 只显示 warning error critical 不会显示 debug info logging.debug('user wrong 3 times')
logging.info('user wrong 3 times')
logging.warning('user wrong 3 times')
logging.error('user wrong 3 times')
logging.critical('user wrong 3 times')
2.输出到文件中
import logging #输出到文件中 显示 >= level(ERROR) 若是不设level 不会显示 debug info logging.basicConfig(filename='logmsg.log',level=logging.ERROR) logging.debug('user wrong 3 times')
logging.info('user wrong 3 times')
logging.warning('user wrong 3 times')
logging.error('user wrong 3 times')
logging.critical('user wrong 3 times')
3.输出日期格式
import logging logging.basicConfig(filename='logmsg.log', format='%(asctime)s - %(levelno)s - %(levelname)s - %(filename)s - %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p', level=logging.DEBUG)
# logging.basicConfig(format='%(asctime)s %(message)s',datefmt='%Y-%m-%d %I:%M:%S %p',level=logging.DEBUG) logging.debug('user wrong 3 times')
logging.info('user wrong 3 times')
logging.warning('user wrong 3 times')
logging.error('user wrong 3 times')
logging.critical('user wrong 3 times') 除了加时间,还可以自定义一大堆格式,下表就是所有支持的格式
%(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 用户输出的消息
4.同时输出到屏幕和文件中:四个组件,类:logger handler filter formatter
import logging
from logging import handlers class IgnoreBackupLogFilter(logging.Filter):
"""忽略带db backup 的日志"""
def filter(self, record): #固定写法
return "db backup" not in record.getMessage() #如果是True就记录 # 1.生成logger对象
logger= logging.getLogger('web')
logger.setLevel(logging.DEBUG) #1.1 把filter对象添加到logger中
logger.addFilter(IgnoreBackupLogFilter()) #2.生成handler对象
ch = logging.StreamHandler()
# ch.setLevel(logging.INFO)
# fh = logging.FileHandler('lweb.log')
# RotatingFileHandler( filename[, mode[, maxBytes[, backupCount]]]) 按文件大小截断
# fh = handlers.RotatingFileHandler('lweb.log',maxBytes=10,backupCount=3)
# TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]]) 按时间截断
fh = handlers.TimedRotatingFileHandler('lweb.log',when='S',interval=5,backupCount=3)
# fh.setLevel(logging.WARNING) #2.1把handler对象绑定到logger
logger.addHandler(ch)
logger.addHandler(fh) #3.生成formatter对象
#3.1把formatter对象绑定到handler对象
file_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
console_formatter = logging.Formatter('%(asctime)s - %(name)s - %(lineno)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S %p')
ch.setFormatter(console_formatter)
fh.setFormatter(file_formatter) logger.debug('user db backup wrong 3 times')
logger.info('user wrong 3 times')
logger.warning('user wrong 3 times')
logger.error('user db backup wrong 3 times')
logger.critical('user db backup wrong 3 times') # 没有给级别 之前 默认是 warning
#handler的级别不能比全局低
#像是一个漏斗 全局过滤之后 才到handler
#全局设置为DEBUG后 console handler 设置为 INFO ,如果输出的日志级别为debug,那就不会在屏幕上打印
#注意:
maxBytes用于指定日志文件的最大文件大小
backupCount用于指定保留的备份文件的个数
when参数是一个字符串 S秒 M分 H小时 D天 W每星期(interval==0时 代表星期一) midnight 每天凌晨
interval是时间间隔
-------------------------------------------------------------------------------
re 模块
正则表达式:字符串的匹配规则
1.re常见的匹配语法有以下几种
re.match 从头开始匹配 只匹配一个就返回 场景:手机号
re.search 全局匹配 只匹配一个就返回
re.findall 把所有匹配到的字符放到以列表中的元素返回 phones = re.findall('1[0-9]{10}', data)
re.split 以匹配到的字符当做列表分隔符
re.sub 匹配字符并替换
re.fullmatch 全部匹配 re.match('[0-9]','123dasd') = <_sre.SRE_Match object; span=(0, 1), match=''>
re.search('[0-9]','abc1d3e') = <_sre.SRE_Match object; span=(3, 4), match=''> #
re.findall('[0-9]','abc1d3e') = ['', '']
注:
match 和 search 返回是一个对象 是这样拿值的:需要先判断 否则会报错
res = re.search('[0-9]','abs1d2')
if res:
print(res.group()) re.match('sd','sd*sda') == re.search('^sd','sd*sda') == re.search('\Asd','sd*sda') == sd
re.search('sd$','adssasd') == re.search('sd\Z','adssasd') == sd
re.search('[0-9]','alex23') == re.search('\d','alex23') == 2
2.示例:
re.search('.','*a2a3sdas') == * #任意一个字符
re.search('^sd','sd*sda') == sd #以什么开头
re.search('sd$','sdasd') == sd #以什么结尾
re.match('b$','b') == b #只匹配一个
re.search('ab*','abblex') == abb #*前一个字符0次或多次
re.search('ab*','sdad') == a
re.search('ab+','sdad') == None
re.search('ab+','sdabbbd') == abbb
re.search('a+','sdaa') == aa #+前一个字符1次或多次
re.search('.+','abcd') == abcd #匹配到所有
re.search('a?','aasad') == a #?前一个字符0次或1次
re.search('a{2}','dddaa') == aa #{m}前一个字符m次
re.search('[0-9]','asd232') == 2 #[] 匹配0-9一次 [a-z]
re.search('[a-z]{1,5}','2lex') == lex #{n,m}匹配前一个字符n到m次
re.search('[a|A]lex','alex') == alex #|或 匹配左或右的字符
re.search('([a-z]+)([0-9]+)','alex123').groups() == ('alex', '') #()()分组匹配 re.search('\Aalex','alex') == alex #\A以什么开头
re.search('sd\Z','adssasd') == sd #\Z以什么结尾
re.search('\d','alex23') == 2 #\d匹配数字0-9
re.search('\d+','alex23') == 23
re.search('\D','alex23') == a #匹配非数字
re.search('\D+','@*&234alex23') == @*&
re.search('\w+','!@#23saAS') == 23saAS #匹配[A-Z a-z 0-9]
re.search('\W+','!$@23saAS') == !$@ #匹配非[A-Z a-z 0-9] 即:特殊字符
re.findall('\s','alex\njack\rma ck\tjack') == ['\n', '\r', ' ', '\t'] #匹配空白字符 \n \r \t s='' #分组,可定义成字典
re.search('(?P<province>\d{3})(?P<city>\d{3})(?P<born_year>\d{4})',s).groups() == ('', '', '')
re.search('(?P<province>\d{3})(?P<city>\d{3})(?P<born_year>\d{4})',s).groupdict() == {'province': '', 'city': '', 'born_year': ''}
3.常用的表达式规则
'.' 默认匹配除\n之外的任意一个字符,若指定flag DOTALL,(re.S)则匹配任意字符,包括换行
'^' 匹配字符开头,若指定flags MULTILINE,(re.M)这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
'$' 匹配字符结尾, 若指定flags MULTILINE(re.M) ,re.search('foo.$','foo1\nfoo2\n',re.MULTILINE).group() 会匹配到foo1
'*' 匹配*号前的字符0次或多次, re.search('a*','aaaabac') 结果'aaaa'
'+' 匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb']
'?' 匹配前一个字符1次或0次 ,re.search('b?','alex').group() 匹配b 0次
'{m}' 匹配前一个字符m次 ,re.search('b{3}','alexbbbs').group() 匹配到'bbb'
'{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb']
'|' 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'
'(...)' 分组匹配, re.search("(abc){2}a(123|45)", "abcabca456c").group() 结果为'abcabca45' '\A' 只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的,相当于re.match('abc',"alexabc") 或^
'\Z' 匹配字符结尾,同$
'\d' 匹配数字0-9
'\D' 匹配非数字
'\w' 匹配[A-Za-z0-9]
'\W' 匹配非[A-Za-z0-9]
'\s' 匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t' '(?P<name>...)' 分组匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","").groupdict("city") 结果{'province': '', 'city': '', 'birthday': ''}
4.分割:re.split() 替换:re.sub() 全部匹配:re.fullmatch() 全部匹配:pattern = re.compile() pattern.fullmatch() 效率高
s='alex22jack23jinxin50|mack-oldboy'
re.split('\d+|\||-',s) == ['alex', 'jack', 'jinxin', '', 'mack', 'oldboy']
re.findall('\d+|\||-',s) = ['', '', '', '|', '-']
s='alex22jack23jinxin50\mack-oldboy'
re.split('\\\\',s) == ['alex22jack23jinxin50', 'mack-oldboy']
s='9-2*5/3+7/3*99/4*2998+10*568/14'
re.split('\W+',s) == ['', '', '', '', '', '', '', '', '', '', '', '']
re.split('\W+',s,maxsplit=3) == ['', '', '', '3+7/3*99/4*2998+10*568/14']
re.split('[-\*/\+]',s) == ['', '', '', '', '', '', '', '', '', '', '', ''] s = 'alex22jack23jinxin50\\mack-oldboy'
re.sub('\d+','_',s) == 'alex_jack_jinxin_\\mack-oldboy'
re.sub('\d+','_',s,count=2) == 'alex_jack_jinxin50\\mack-oldboy' re.fullmatch('\w+@\w+\.(com|cn|edu)','alex@oldboyedu.com') # 慢 规则需要转换成bytes需时间 pattern = re.compile('\w+@\w+\.(com|cn|edu)') #快 规则转换bytes1次就可以了
pattern.fullmatch('alex@oldboyedu.com') == <_sre.SRE_Match object; span=(0, 18), match='alex@oldboyedu.com'>
5.标识符 Flags
re.I #忽略大小写 re.IGNORECASE
re.M #多行模式 re.MULTILINE
re.S #改变.的行为,.是任意字符,除了换行符\n re.DOTALL
re.X #可对正则 规则 注释 re.VERBOSE re.search('a','Alex',re.I) == A
re.search('foo.$','foo1\nfoo2\n') == foo2
re.search('foo.$','foo1\nfoo2\n',re.M) == foo1
re.search('^s','\nsds',re.M) == s
re.search('.','\n') == None
re.search('.','\n',re.S) == \n
re.search('.','alex') == a
re.search('. #test','alex') == None
re.search('. #test','alex',re.X) = a
注:
[^"] 表示不包含“这个字符
[^()] 表示不包含()这个括号
re.search(r'\\','asd2\sad') == <_sre.SRE_Match object; span=(4, 5), match='\\'>
re.search('\\\\','asd2\sad') == <_sre.SRE_Match object; span=(4, 5), match='\\'>
r:表示原生字符串
logging/re - 总结的更多相关文章
- Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
学习架构探险,从零开始写Java Web框架时,在学习到springAOP时遇到一个异常: "C:\Program Files\Java\jdk1.7.0_40\bin\java" ...
- Oracle补全日志(Supplemental logging)
Oracle补全日志(Supplemental logging)特性因其作用的不同可分为以下几种:最小(Minimal),支持所有字段(all),支持主键(primary key),支持唯一键(uni ...
- Java程序日志:java.util.logging.Logger类
一.Logger 的级别 比log4j的级别详细,全部定义在java.util.logging.Level里面.各级别按降序排列如下:SEVERE(最高值)WARNINGINFOCONFIGFINEF ...
- python 学习笔记 -logging模块(日志)
模块级函数 logging.getLogger([name]):返回一个logger对象,如果没有指定名字将返回root loggerlogging.debug().logging.info().lo ...
- python logging colorlog
import logging LOG_LEVEL = logging.NOTSET LOGFORMAT = "[%(log_color)s%(levelname)s] [%(log_colo ...
- [转]ASP.NET Core 开发-Logging 使用NLog 写日志文件
本文转自:http://www.cnblogs.com/Leo_wl/p/5561812.html ASP.NET Core 开发-Logging 使用NLog 写日志文件. NLog 可以适用于 . ...
- python 之 logging
#coding=utf-8 import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename ...
- Python Logging模块的简单使用
前言 日志是非常重要的,最近有接触到这个,所以系统的看一下Python这个模块的用法.本文即为Logging模块的用法简介,主要参考文章为Python官方文档,链接见参考列表. 另外,Python的H ...
- python模块(shelve,xml,configparser,hashlib,logging)
1.1shelve模块 shelve 模块比pickle模块简单,只有一个open函数,返回类似字典对象,可读可写:key必须为字符串, 而值可以是python所支持的数据类型. shelve模块主要 ...
- logging 文件日志
1. 例子 import logging logging.basicConfig(filename='log.txt', #文件名 level=logging.DEBUG, #级别 format=u' ...
随机推荐
- centos7和scientific linux7里面调出中文输入法
默认安装后,却没有中文输入,于是研究以下,原来是没有调出来. 1.应用程序->系统工具->设置 2.选择“区域和语言” 3.这里默认会有一个汉语,如果没有,那么你当初选择安装的是英语,需要 ...
- [svc][op]从历险压缩日志里网站pv uv统计
http://myhoop.blog.51cto.com/5556534/1367523 tomcat日志格式: http://www.cnblogs.com/anic/archive/2012/12 ...
- 3.Queues(队列)
一.概述 C++队列是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构,与stack刚好相反. 二.常用API back() 返回最后一个元素 empty() 如果队列空则返回真 fro ...
- flink checkpoint 源码分析 (二)
转发请注明原创地址http://www.cnblogs.com/dongxiao-yang/p/8260370.html flink checkpoint 源码分析 (一)一文主要讲述了在JobMan ...
- url参数
两个参数情况: String url="http://59.78.93.208:9097/Order?id="+id+"&value="+value; ...
- socket编程头文件分析
在socket网络编程中经常用到一些宏定义.结构和函数,这些经常包含在相关的头文件中,使用时直接include相关头文件即可.下面简单描述下相关的一些结构及头文件. 1. sockaddr / bi ...
- visitor设计模式记录
数据类型通过枚举来区分是一种简单实用的做法. 缺点是使用的时候需要通过if .switch 去判断什么类型执行什么分支操作,说是缺点其实也要看具体场景.不过如果if代码多会导致代码很长是肯定的. 复杂 ...
- ASP.NET控件属性大全
ASP.NET控件属性大全 DataGridView 控件DataGridView 控件提供用来显示数据的可自定义表.使用 DataGridView 类,可以自定义单元格.行.列和边框. 注意Data ...
- Android插件化开发之OpenAtlas生成插件信息列表
上一篇文章.[Android插件化开发之Atlas初体验]( http://blog.csdn.net/sbsujjbcy/article/details/47446733),简单的介绍了使用Atla ...
- c#上传大文件方法
客户端代码: /// <summary> /// 将本地文件上传到指定的服务器(HttpWebRequest方法) /// </summary> /// <param n ...