- 正则表达式工作模式-贪婪模式,尽可能匹配可能长的匹配字符,所有*匹配所有,匹配短用 \? 或者 .?
- 元字符:不代表字符本身的含义
代码 说明
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配行的开始
$ 匹配行的结束
代码 说明
\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符
代码 说明
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
.:匹配任意单个字符: grep 'r..t' 就可以匹配:root,rlut,, 'r.t':可以匹配:rat,rlt等
[]:指定范围内的任意单个字符
[0-9],[[:digit:]]
[a-z],[[:lower:]]
[A-Z],[[:upper:]]
[:alpha:] ##所有的大小写字母
[:alnum:] ##所有数字
[:space:] ##所有空格
[:punct:] ##所有标点
[^]:指定范围外的任意单个字符
*: 任意字数:例子:x*y,xxy,xy,y:值得是前面的x出现0此或者多次。上面的可以表上 grep 'r*t' t,rrt,xrt
.*:匹配任意长度的任意字符。
\?: 用来匹配其前面的字符 0次或者1次。(很显然*比\?是最多的)
x\?y:xy,y,xxy(xxy只能匹配最后一个xy)
\{m\}: 匹配m次。 \{m,n\}:匹配至少m次,最多n次。\{m,\}:至少m次。 \{0,n\}:至多n次
x\{2\}y:表上x出现两次:xxy. x\{2,6\}y:至少2次到6次: xxxy,xxxxxy,
^:锚定行首。所以这个符号必须出现在行首。
$:锚定行尾。
$:空白行。
\<char:锚定词首,或者\b:char: (相对于单词)
(env)[root@www devops]# grep '^Rr][^[:punct:]]*[t7]' /etc/passwd ###表示以r开头的单词
char\>:锚定词尾,或者char\b
logstash提供一系列的常见正则表达式 也支持自己的grok 表达式
grok 表达式格式
%{PATTERN_NAME:capture_name:data_type}
(?<msg>(\S+|\s+)+)
(?<name>pattern)
#()表示要取出来的值
#?<name>为值取的名字
#pattern表达式 用于描述值的格式
grok默认调用的表达式是:logstash-5.0.0/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-4.0.2/patterns 这个路径下。
常见的时间戳
%{TIMESTAMP_ISO8601:date} yyyy-MM-dd HH:mm:ss,SSS Z
常见的日志等级
%{LOGLEVEL:level}
([Aa]lert|ALERT|[Tt]race|TRACE|[Dd]ebug|DEBUG|[Nn]otice|NOTICE|[Ii]nfo|INFO|[Ww]arn?(?:ing)?|WARN?(?:ING)?|[Ee]rr?(?:or)?|ERR?(?:OR)?|[Cc]rit?(?:ical)?|CRIT?(?:ICAL)?|[Ff]atal|FATAL|[Ss]evere|SEVERE|EMERG(?:ENCY)?|[Ee]merg(?:ency)?)
线程名字
%{NOTSPACE:thread}
常见的host
%{IPORHOST:clientip} (?:%{IP}|%{HOSTNAME})
任意长度字符串
(\S+|\s+)+
#Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下:
#%m 输出代码中指定的消息
#%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
#%r 输出自应用启动到输出该log信息耗费的毫秒数
#%c 输出所属的类目,通常就是所在类的全名
#%t 输出产生该日志事件的线程名
#%n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”
#%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式
# 如:%d{yyyy年MM月dd日HH:mm:ss,SSS},输出类似:2012年01月05日 22:10:28,921
#%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数
# 如:Testlog.main(TestLog.java:10)
#%F 输出日志消息产生时所在的文件名称
#%L 输出代码中的行号
#%x 输出和当前线程相关联的NDC(嵌套诊断环境),像javaservlets多客户多线程的应用中
#%% 输出一个"%"字符
#
# 可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
# %5c: 输出category名称,最小宽度是5,category<5,默认的情况下右对齐
# %-5c:输出category名称,最小宽度是5,category<5,"-"号指定左对齐,会有空格
# %.5c:输出category名称,最大宽度是5,category>5,就会将左边多出的字符截掉,<5不会有空格
# %20.30c:category名称<20补空格,并且右对齐,>30字符,就从左边交远销出的字符截掉
log4j.properties中是这样的:
log4j.appender.stdout.layout.ConversionPattern=%d %p %m%n
并且,我的日志输出类中拼凑的格式是这样的:
logger.info(ip+"/"+username +"/" + method +"/" + requestUrl)
所以最后打印出来的日志是这样的:
2016-12-01 11:18:05,550 INFO 127.0.0.1/zhangsan/GET/http:
这里的信息都是我需要的 ,时间-日志级别-IP-用户名-method-请求url,