logstash截取指定字符和grok的使用
logstash截取指定字符
由于项目原因有些日志打印出来之后,会在kibana中显示很不友好而且加载ES的时候也特别的慢,所以我想有没有办法可以让日志在kibana中展示的比较友好一点呢,于是找来很多相关的资料,种感觉有点差异,然后自己摸索的一点出来
在网上看到有很多种截取方式 有在filebeat中做过滤的 ,有在logstash中过滤的,这里简单的说说logstash中的一些
我们用grok来做一些过滤,grok支持正则表达式.
正则表达式的验证.
Item | Comment |
---|---|
%{USER:user} | 以 USER 模式进行正则匹配,结果放在user中 |
[[^]]+] | 以 [ 开头 以]结尾,内容是由一个或多个不是 ] 的字符填充而成 |
%{NUMBER: id:int} | 以 NUMBER 模式进行正则匹配,为整数型,结果放在id中 |
\n | 匹配换行符 |
%{NUMBER:query_time:float} | 以 NUMBER 模式进行正则匹配,为浮点型,结果放在query_time中 |
(?:use\s+%{USER:usedatabase};\s*\n)? | 这个匹配可能有,也可能无,如果有,就是以use开头,若干空字符,以 USER 模式进行正则匹配,结果放在usedatabase中,然后紧接着 ; ,后面是0个或多个空字符,然后是换行,注意:如果有是整体有,如果无,是整体无 |
\b | 代表字单词边界不占位置,只用来指示位置 |
.* | 尽可能多的任意匹配 |
(?< query>(?< action>\w+)\b.*) | 整体匹配,存到query中,以一个或多个字符开头组成的单词,结果存到action中 |
(?:\n#\s+Time)? | 内容可能有,也可能无,如果有,是接在一个换行之后,以 # 开头,隔着一个或多个空字符,然后是Time |
.*$ | 任意匹配直到结尾 |
grok正则表达式:(?<temMsg>(.*)(?=Report)/?) 获取Report之前的字符
grok正则表达式:(?<temMsg>(?=Report)(.*)/?) 获取Report之后的字符
grok{match => { #截取<Report>之前的字符作为temMsg字段的值"message" => "(?<temMsg>(.*)(?=Report)/?)" }}
这个是截取特定的字符集日志,要日志中包含了【Report】关键字
(注:表达式中(?=Report)中的等于【=】符号如果换成【<=】这表示就不包含本身了,例如(?<temMsg>(.*)(?=Report)/?)可以写成(?<temMsg>(.*)(?<=Report)/?)这样输出的结果就不包含Report了,同理下面的一样)
grok正则表达式:(?<temMsg>(?<=report).*?(?=msg)) 截取report和msg之间的值 不包含report和msg本身
grok正则表达式:(?<temMsg>(report).*?(?=msg)) 截取 包含report但不包含msg
grok正则表达式:(?<temMsg>(?<=report).*?(msg))截取 不包含report但包含msg
grok正则表达式:(?<temMsg>(report).*?(msg|request))输出以report开头,以msg或者以request结尾的所有包含头尾信息
grok正则表达式:(?<temMsg>(report).*?(?=(msg|request)))输出以report开头,以msg或者以request结尾的不包含头尾信息
grok{match => { #截取<Report>之后的和<msg>之前的值作为temMsg字段的值"message" => "(?<temMsg>(?<=report).*?(?=msg))" }}
这个是截取特定的字符集日志,要日志中包含了【report和msg和request】关键字
之间的表达式只要替换一下就可以使用了
(注过个表达式中出现异常,在单个的字符串中可以将小括号【()】去掉,例如:(report).*?(?=msg) 可以写成report.*?(?=msg))
grok正则表达式:(?<MYELF>([\s\S]{500}))grok{match => {#截取日志500个字符 作为MYELF的值"message" => "(?<MYELF>([\s\S]{500}))" }}对有所日志截取500个字符,可以加入if()做为判断条件,根据自身项目来
grok正则表达式:%{LOGLEVEL:level}
grok {#这个patterns_dir大家都应该正对 单独写表达式的地方#patterns_dir => "/usr/local/nlp/logstash-6.0.1/config/patterns"match => ["message","%{LOGLEVEL:level}" ]}这个比较简单 就不多说了
结合上面的 这个是对level级别的日志做判断 如果日志中含有DEBUG的,就drop掉
if [level] == "DEBUG" {drop { }
}
这个其实和上面差不多,加了一个【~】表示对单条的前后日志做匹配
if[message]=~"ASPECT"{drop { }
}
这个是说对temMsg赋值的所有的日志从新命名打印message
mutate {#重命名字段temMsg为messagerename => {"temMsg" => "message"}
}
#logstash过滤器切割
filter { if [type] == "simple" {mutate{split => ["message","|"] #按 | 进行split切割messageadd_field => {"requestId" => "%{[message][0]}"}add_field => {"timeCost" => "%{[message][1]}"}add_field => {"responseStatus" => "%{[message][2]}"}add_field => {"channelCode" => "%{[message][3]}"}add_field => {"transCode" => "%{[message][4]}"}}mutate {convert => ["timeCost", "integer"] #修改timeCost字段类型为整型}} else if [type] == "detail" {grok{match => { #将message里面 TJParam后面的内容,分隔并新增为ES字段和值"message" => ".*TJParam %{PROG:requestId} %{PROG:channelCode} %{PROG:transCode}"}}grok{match => { #截取TJParam之前的字符作为temMsg字段的值"message" => "(?<temMsg>(.*)(?=TJParam)/?)" #删除字段messageremove_field => ["message"] }}mutate {#重命名字段temMsg为messagerename => {"temMsg" => "message"} }}
}
最后来一个完整的
input {redis {data_type => "list"host => "localhost1"port => "5100"key => "nlp_log_file"db => 0 threads => 1 #线程数量codec => "json"}redis {data_type => "list"host => "localhost2"port => "5101"key => "nlp_log_file"db => 0 threads => 1 #线程数量codec => "json"}
}filter {grok {#patterns_dir => "/usr/local/nlp/logstash-6.0.1/config/patterns"match => ["message","%{LOGLEVEL:level}" ]}grok{match => { #截取<ReportPdf>之前的字符作为temMsg字段的值"message" => "(?<temMsg>(.*)(?=<ReportPdf>)/?)" }}mutate {#重命名字段temMsg为messagerename => {"temMsg" => "message"} }if [level] == "DEBUG" {drop { }}if[message]=~"ASPECT"{drop { }}#获取日志文件带RAWT关键字的if[message]=~"[RAW]"{ grok{match => {#截取带RAW关键字的日志500个字符 作为MYELF的值"message" => "(?<MYELF>([\s\S]{500}))" }}mutate {rename => {"MYELF" => "message"} #重命名字段MYELF为message}}
}output {elasticsearch {hosts => ["localhost:9200"]index => "logstash-%{+YYYY.MM.dd}" action => "index"template_overwrite => true#user => "elastic"#password => "admins-1"}stdout{codec => dots}
}
logstash截取指定字符和grok的使用相关推荐
- mysql截取前几个字符串_mysql中截取指定字符前后的字符串
使用SUBSTRING_INDEX()函数 substring_index(str,delim,count) str:要处理的字符串 delim:分隔符 count:分隔符计数 例子 取出上述表中数组 ...
- js截取指定字符前面或后面的内容,可以设置指定符号 “-” “%”等
created(){let value = '605-狗狗糯'this.changeCate(value ) }, methods:{// 系统分类changeCate(value) {//value ...
- js 截取指定字符前的字符
// **截取指定字符前的字符**getStr(string, str) {var str_before = string.split(str)[0];var str_after = string.s ...
- JS字符串截取 “指定字符” 前面和后面的内容!
JS字符串截取 "指定字符" 前面和后面的内容! var string= "07/12" var before = string.split('/')[0] v ...
- SQL如何从字符串截取指定字符(LEFT、MID、RIGHT三大函数)
目录 1.LEFT函数 2.MID函数 3.RIGHT函数 1.LEFT函数 (1)语法:left(text,len)即left(字符串文本,长度) 查询语句 select [column(s),] ...
- String截取指定字符
截取指定字符类 /*** 截取指定字段*/ public class SubString {public static String subString(String str, String strS ...
- js截取指定字符前面或后面的内容
js截取指定字符前面或后面的内容 function getCaption(obj,state) {var index=obj.lastIndexOf("\-"); if(state ...
- js 截取指定字符后面/前面的所有字符串
解决方案: //js 截取指定字符后面/前面的所有字符串let str = '你还好吗?嗯?我很好!'//截取第一个?前面的字符串var index = str.indexOf("?&quo ...
- EXCEL截取指定字符后的中文字符
EXCEL截取指定字符后的中文字符,例:银行存款-银行存款-建设银行-活期户,这种结构的字符,以-为分隔,要取出最后的一段.如图: 可以这样写公式:=TRIM(RIGHT(SUBSTITUTE(I2, ...
最新文章
- hihoCoder挑战赛29
- [导入]注意!玩具也能成危险
- 一步一步CCNA之六:交换机vtp配置
- python对逻辑回归进行显著性_python sklearn库实现简单逻辑回归的实例代码
- Activiti第二篇【管理流程定义、执行任务和流程实例、流程变量】
- 删除指定下标的元素c语言,PHP删除数组中指定下标的元素方法
- 《C和指针》读书笔记
- Dapr 交通流量控制示例
- [AtCoder Educational DP Contest] J - Sushi(期望dp)
- c语言文件分屏显示,通用子目录文件显示方法
- 树莓派4B (aarch64) 安装PyTorch 1.8 的可行方案
- 优质淘宝产品描述页模板框架PSD分层模板,美工实用素材
- 腾讯拟全资收购搜狗;英特尔人事大变动,首席工程官将离职;TensorFlow 2.3.0 正式发布 | 极客头条
- eclipse 改java版本_修改eclipse工程jdk版本
- ThinkPHP5-商城小程序-web技术栈|
- android 斜线 绘制_Android绘图:绘制直线的 drawLine方法
- 河北大学计算机学院赵润,影视编导
- 2022-06-29 AndroidR 获取接近传感器Proximity Sensor的信号,休眠和唤醒。
- 2021-07-112021年中式烹调师(初级)模拟考试题及中式烹调师(初级)实操考试视频
- Java读取数据库的数据并转换为json数据