【Distributed】分布式ELK日志文件分析系统(二)

文章目录

  • 一、Filebeat+ELK 部署
    • 1. 环境部署
    • 2. 在 Filebeat 节点上操作
      • 2.1 安装 Filebeat
      • 2.2 设置 filebeat 的主配置文件
    • 3. 在 Apache 节点上操作
      • 3.1 在 Logstash 组件所在节点上新建一个 Logstash 配置文件
    • 3. 启动
      • 3.1 在Logstash 组件所在节点启动
      • 3.2 在 Filebeat 节点 启动
    • 4. 浏览器访问
  • 二、Filter 插件
    • 1. grok 正则捕获插件
      • 1.1 内置正则表达式调用
        • 官方定义的内置正则表达式
      • 1.2 自定义表达式调用
      • 1.3 案例
        • httpd 日志文件正则匹配
        • Logstash 配置文件
    • 2. mutate 数据修改插件
      • 2.1 常用配置选项
      • 2.2 案例
    • 3. multiline 多行合并插件
      • 3.1 安装 multiline 插件
      • 3.2 使用 multiline 插件
    • 4. date 时间处理插件
      • 4.1 用法
      • 4.2 时间戳详解
      • 4.3 案例
  • 总结
    • 1. ip地址(ipv4)的正则表达式
    • 2. logstash filter过滤插件


一、Filebeat+ELK 部署

1. 环境部署

Node1节点(2C/4G) 	node1/192.168.145.15					  Elasticsearch
Node2节点(2C/4G) 	node2/192.168.145.30					  Elasticsearch
Apache节点	 	apache/192.168.145.45						Logstash  Kibana  Apache
Filebeat节点		filebeat/192.168.145.60						Filebeat

2. 在 Filebeat 节点上操作

2.1 安装 Filebeat

#上传软件包 filebeat-6.7.2-linux-x86_64.tar.gz 到/opt目录
tar zxvf filebeat-6.7.2-linux-x86_64.tar.gz
mv filebeat-6.7.2-linux-x86_64/ /usr/local/filebeat

在这里插入图片描述

2.2 设置 filebeat 的主配置文件

cd /usr/local/filebeat
cp filebeat.yml{,.bak}			#添加备份文件vim filebeat.yml
filebeat.inputs:
- type: log        			 	#指定 log 类型,从日志文件中读取消息enabled: truepaths:- /var/log/messages       	#指定监控的日志文件- /var/log/*.logtags: ["sys"]					#31行添加,设置索引标签fields:           			#46行取消注释,可以使用 fields 配置选项设置一些参数字段添加到 output 中service_name: filebeatlog_type: syslogfrom: 192.168.145.60--------------Elasticsearch output-------------------
(全部注释掉)----------------Logstash output---------------------
output.logstash:hosts: ["192.168.145.45:5044"]      #指定 logstash 的 IP 和端口

在这里插入图片描述

3. 在 Apache 节点上操作

3.1 在 Logstash 组件所在节点上新建一个 Logstash 配置文件

cd /etc/logstash/conf.dvim filebeat.conf
input {beats {port => "5044"}
}output {elasticsearch {hosts => ["192.168.145.15:9200","192.168.145.30:9200"]index => "%{[fields][service_name]}-%{+YYYY.MM.dd}"}stdout {codec => rubydebug}
}

在这里插入图片描述

3. 启动

3.1 在Logstash 组件所在节点启动

#启动 filebeat
cd /usr/local/filebeat
nohup ./filebeat -e -c filebeat.yml > filebeat.out &#-e:输出到标准输出,禁用syslog/文件输出
#-c:指定配置文件
#nohup:在系统后台不挂断地运行命令,退出终端不会影响程序的运行

在这里插入图片描述

3.2 在 Filebeat 节点 启动

#启动 logstash
logstash -f filebeat.conf

在这里插入图片描述

4. 浏览器访问

浏览器访问 http://192.168.145.45:5601 登录 Kibana,单击“Create Index Pattern”按钮添加索引“httpd-*”,单击 “create” 按钮创建,单击 “Discover” 按钮可查看图表信息及日志信息。

在这里插入图片描述

在这里插入图片描述

#若网页的索引显示%{[fields][service_name]},则可以删除之前运行的instance的缓冲数据
#保存在path.data里面有.lock文件中,查找到.lock文件的保存位置,删除该缓存文件。
cd /var/lib/
ll -A
rm -rf .lock

二、Filter 插件

1. grok 正则捕获插件

grok 使用文本片段切分的方式来切分日志事件。

1.1 内置正则表达式调用

#内置正则语法
%{SYNTAX:SEMANTIC}#SYNTAX代表匹配值的类型,例如,0.11可以NUMBER类型所匹配,10.222.22.25可以使用IP匹配。
#SEMANTIC表示存储该值的一个变量声明,它会存储在elasticsearch当中方便kibana做字段搜索和统计,你可以将一个IP定义为客户端IP地址client_ip_address,如%{IP:client_ip_address},所匹配到的值就会存储到client_ip_address这个字段里边,类似数据库的列名,也可以把 event log 中的数字当成数字类型存储在一个指定的变量当中,比如响应时间http_response_time,假设event log record如下:可以使用如下grok pattern来匹配这种记录
%{IP:client_id_address} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:http_response_time}

在这里插入图片描述

filter.conf 文件正则则取ip地址

在logstash conf.d文件夹下面创建filter.conf文件,内容如下
# /etc/logstash/conf.d/filter.conf
filter {grok {match => { "message" => "%{IP:client_id_address} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:http_response_time}" }}
}以下是filter结果
client_id_address: 192.168.145.15
method: GET
request: /index.html
bytes: 15824
http_response_time: 0.043

官方定义的内置正则表达式

logstash 官方也给了一些常用的常量来表达那些正则表达式,可以到这个 Github 地址查看有哪些常用的常量:
https://github.com/logstash-plugins/logstash-patterns-core/blob/main/patterns/ecs-v1/grok-patterns

grok-patterns文件内容如下

USERNAME [a-zA-Z0-9._-]+
USER %{USERNAME}
EMAILLOCALPART [a-zA-Z][a-zA-Z0-9_.+-=:]+
EMAILADDRESS %{EMAILLOCALPART}@%{HOSTNAME}
INT (?:[+-]?(?:[0-9]+))
BASE10NUM (?<![0-9.+-])(?>[+-]?(?:(?:[0-9]+(?:\.[0-9]+)?)|(?:\.[0-9]+)))
NUMBER (?:%{BASE10NUM})
BASE16NUM (?<![0-9A-Fa-f])(?:[+-]?(?:0x)?(?:[0-9A-Fa-f]+))
BASE16FLOAT \b(?<![0-9A-Fa-f.])(?:[+-]?(?:0x)?(?:(?:[0-9A-Fa-f]+(?:\.[0-9A-Fa-f]*)?)|(?:\.[0-9A-Fa-f]+)))\bPOSINT \b(?:[1-9][0-9]*)\b
NONNEGINT \b(?:[0-9]+)\b
WORD \b\w+\b
NOTSPACE \S+
SPACE \s*
DATA .*?
GREEDYDATA .*
QUOTEDSTRING (?>(?<!\\)(?>"(?>\\.|[^\\"]+)+"|""|(?>'(?>\\.|[^\\']+)+')|''|(?>(?>\\.|[^\\]+)+)|))
UUID [A-Fa-f0-9]{8}-(?:[A-Fa-f0-9]{4}-){3}[A-Fa-f0-9]{12}
# URN, allowing use of RFC 2141 section 2.3 reserved characters
URN urn:[0-9A-Za-z][0-9A-Za-z-]{0,31}:(?:%[0-9a-fA-F]{2}|[0-9A-Za-z()+,.:=@;$_!*'/?#-])+# Networking
MAC (?:%{CISCOMAC}|%{WINDOWSMAC}|%{COMMONMAC})
CISCOMAC (?:(?:[A-Fa-f0-9]{4}\.){2}[A-Fa-f0-9]{4})
WINDOWSMAC (?:(?:[A-Fa-f0-9]{2}-){5}[A-Fa-f0-9]{2})
COMMONMAC (?:(?:[A-Fa-f0-9]{2}:){5}[A-Fa-f0-9]{2})
IPV6 ((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?
IPV4 (?<![0-9])(?:(?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5]))(?![0-9])
IP (?:%{IPV6}|%{IPV4})
HOSTNAME \b(?:[0-9A-Za-z][0-9A-Za-z-]{0,62})(?:\.(?:[0-9A-Za-z][0-9A-Za-z-]{0,62}))*(\.?|\b)
IPORHOST (?:%{IP}|%{HOSTNAME})
HOSTPORT %{IPORHOST}:%{POSINT}# paths
PATH (?:%{UNIXPATH}|%{WINPATH})
UNIXPATH (/([\w_%!$@:.,+~-]+|\\.)*)+
TTY (?:/dev/(pts|tty([pq])?)(\w+)?/?(?:[0-9]+))
WINPATH (?>[A-Za-z]+:|\\)(?:\\[^\\?*]*)+
URIPROTO [A-Za-z]([A-Za-z0-9+\-.]+)+
URIHOST %{IPORHOST}(?::%{POSINT:port})?
# uripath comes loosely from RFC1738, but mostly from what Firefox
# doesn't turn into %XX
URIPATH (?:/[A-Za-z0-9$.+!*'(){},~:;=@#%&_\-]*)+
#URIPARAM \?(?:[A-Za-z0-9]+(?:=(?:[^&]*))?(?:&(?:[A-Za-z0-9]+(?:=(?:[^&]*))?)?)*)?
URIPARAM \?[A-Za-z0-9$.+!*'|(){},~@#%&/=:;_?\-\[\]<>]*
URIPATHPARAM %{URIPATH}(?:%{URIPARAM})?
URI %{URIPROTO}://(?:%{USER}(?::[^@]*)?@)?(?:%{URIHOST})?(?:%{URIPATHPARAM})?# Months: January, Feb, 3, 03, 12, December
MONTH \b(?:[Jj]an(?:uary|uar)?|[Ff]eb(?:ruary|ruar)?|[Mm](?:a|ä)?r(?:ch|z)?|[Aa]pr(?:il)?|[Mm]a(?:y|i)?|[Jj]un(?:e|i)?|[Jj]ul(?:y)?|[Aa]ug(?:ust)?|[Ss]ep(?:tember)?|[Oo](?:c|k)?t(?:ober)?|[Nn]ov(?:ember)?|[Dd]e(?:c|z)(?:ember)?)\b
MONTHNUM (?:0?[1-9]|1[0-2])
MONTHNUM2 (?:0[1-9]|1[0-2])
MONTHDAY (?:(?:0[1-9])|(?:[12][0-9])|(?:3[01])|[1-9])# Days: Monday, Tue, Thu, etc...
DAY (?:Mon(?:day)?|Tue(?:sday)?|Wed(?:nesday)?|Thu(?:rsday)?|Fri(?:day)?|Sat(?:urday)?|Sun(?:day)?)# Years?
YEAR (?>\d\d){1,2}
HOUR (?:2[0123]|[01]?[0-9])
MINUTE (?:[0-5][0-9])
# '60' is a leap second in most time standards and thus is valid.
SECOND (?:(?:[0-5]?[0-9]|60)(?:[:.,][0-9]+)?)
TIME (?!<[0-9])%{HOUR}:%{MINUTE}(?::%{SECOND})(?![0-9])
# datestamp is YYYY/MM/DD-HH:MM:SS.UUUU (or something like it)
DATE_US %{MONTHNUM}[/-]%{MONTHDAY}[/-]%{YEAR}
DATE_EU %{MONTHDAY}[./-]%{MONTHNUM}[./-]%{YEAR}
ISO8601_TIMEZONE (?:Z|[+-]%{HOUR}(?::?%{MINUTE}))
ISO8601_SECOND (?:%{SECOND}|60)
TIMESTAMP_ISO8601 %{YEAR}-%{MONTHNUM}-%{MONTHDAY}[T ]%{HOUR}:?%{MINUTE}(?::?%{SECOND})?%{ISO8601_TIMEZONE}?
DATE %{DATE_US}|%{DATE_EU}
DATESTAMP %{DATE}[- ]%{TIME}
TZ (?:[APMCE][SD]T|UTC)
DATESTAMP_RFC822 %{DAY} %{MONTH} %{MONTHDAY} %{YEAR} %{TIME} %{TZ}
DATESTAMP_RFC2822 %{DAY}, %{MONTHDAY} %{MONTH} %{YEAR} %{TIME} %{ISO8601_TIMEZONE}
DATESTAMP_OTHER %{DAY} %{MONTH} %{MONTHDAY} %{TIME} %{TZ} %{YEAR}
DATESTAMP_EVENTLOG %{YEAR}%{MONTHNUM2}%{MONTHDAY}%{HOUR}%{MINUTE}%{SECOND}# Syslog Dates: Month Day HH:MM:SS
SYSLOGTIMESTAMP %{MONTH} +%{MONTHDAY} %{TIME}
PROG [\x21-\x5a\x5c\x5e-\x7e]+
SYSLOGPROG %{PROG:program}(?:\[%{POSINT:pid}\])?
SYSLOGHOST %{IPORHOST}
SYSLOGFACILITY <%{NONNEGINT:facility}.%{NONNEGINT:priority}>
HTTPDATE %{MONTHDAY}/%{MONTH}/%{YEAR}:%{TIME} %{INT}# Shortcuts
QS %{QUOTEDSTRING}# Log formats
SYSLOGBASE %{SYSLOGTIMESTAMP:timestamp} (?:%{SYSLOGFACILITY} )?%{SYSLOGHOST:logsource} %{SYSLOGPROG}:# Log Levels
LOGLEVEL ([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)?)

1.2 自定义表达式调用

#自定义语法
(?<field_name>pattern)#捕获10或11和长度的十六进制数的queue_id可以使用表达式(?<queue_id>[0-9A-F]{10,11})
例如
message: 192.168.145.15 GET /index.html 15824 0.043(?<remote_addr>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) (?<http_method>[A-Z]+) (?<request_uri>/.*) (?<response_bytes>[0-9]+) (?<response_time>[0-9\.]+)filter {grok {match => { "message" => "(?<remote_addr>%{IP}) (?<http_method>[A-Z]+) (?<request_uri>/.*) (?<response_bytes>[0-9]+) (?<response_time>[0-9\.]+)"}}
}

  如果表达式匹配失败,会生成一个tags字段,字段值为 _grokparsefailure,需要重新检查上边的match配置解析是否正确。

1.3 案例

httpd 日志文件正则匹配

#例如
192.168.80.1 - - [11/Jul/2023:09:48:24 +0800] "GET / HTTP/1.1" 403 4897 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.5359.125 Safari/537.36"192.168.80.1 - - [11/Jul/2023:10:24:52 +0800] "GET /test.html HTTP/1.1" 200 32 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36"192.168.80.20 - - [11/Jul/2023:10:24:36 +0800] "GET /test.html HTTP/1.1" 200 32 "-" "curl/7.29.0"
#分段匹配
remoute_addr  	IP
log_time 		HTTPDATE
http_method		WORD	
request_url		URIPATH
http_ver		.+
response_code	NUMBER
user_agent 		.+%(IP:remoute_addr) - - \[%{HTTPDATE:log_time}] \"%{WORD:http_method} %{URIPATH:request_url} (?<http_ver>.+)" %{NUMBER:response_code} \d \".+\" \"(?<user_agent>.+)\"

在这里插入图片描述

Logstash 配置文件

#filebeat发送给logstash的日志内容会放到message字段里面,logstash使用grok插件正则匹配message字段内容进行字段分割
#Kibana自带grok的正则匹配的工具:http://<your kibana IP>:5601/app/kibana#/dev_tools/grokdebugger
# %{IPV6}|%{IPV4} 为 logstash 自带的 IP 常量
filter {grok {match => ["message", "(?<remote_addr>%{IPV6}|%{IPV4})[\s\-]+\[(?<logTime>.*)\]\s+\"(?<method>\S+)\s+(?<url_path>.+)\"\s+(?<rev_code>\d+) \d+ \"(?<req_addr>.+)\" \"(?<content>.*)\""]}
}

在这里插入图片描述

2. mutate 数据修改插件

  mutate 提供了丰富的基础类型数据处理能力。可以重命名,删除,替换和修改事件中的字段。

2.1 常用配置选项

配置选项含义
add_field向事件添加新字段,也可以添加多个字段
remove_field从事件中删除任意字段
add_tag向事件添加任意标签,在tag字段中添加一段自定义的内容,当tag字段中超过一个内容的时候会变成数组
remove_tag从事件中删除标签(如果存在)
convert将字段值转换为另一种数据类型
id向现场事件添加唯一的ID
lowercase将字符串字段转换为其小写形式
replace用新值替换字段
strip删除开头和结尾的空格
uppercase将字符串字段转换为等效的大写字母
update用新值更新现有字段
rename重命名事件中的字段
gsub通过正则表达式替换字段中匹配到的值
merge合并数组或 hash 事件
split通过指定的分隔符分割字段中的字符串为数组

2.2 案例

将字段old_field重命名为new_field

filter {mutate {#写法1,使用中括号括起来rename => ["old_field" => "new_field"]#写法2,使用大括号{}括起来rename => { "old_field" => "new_field" }		}}

添加字段

filter {mutate {add_field => {"f1" => "field1""f2" => "field2"}}
}

将字段删除

filter {mutate {remove_field  =>  ["message", "@version", "tags"]}
}

将filedName1字段数据类型转换成string类型,filedName2字段数据类型转换成float类型

filter {mutate {#写法1,使用中括号括起来convert  =>  ["filedName1", "string"]#写法2,使用大括号{}括起来convert => { "filedName2" => "float" }}}

将filedName字段中所有"/“字符替换为”_"

filter {mutate {gsub => ["filedName", "/" , "_"]}
}

将filedName字段中所有",“字符后面添加空格

filter {mutate {gsub => ["filedName", "," , ", "]}
}

将filedName字段以"|"为分割符拆分数据成为数组

filter {mutate {split => ["filedName", "|"]}
}

合并 “filedName1” 和 “ filedName2” 两个字段

filter {merge  { "filedName2" => "filedName1" }
}

用新值替换filedName字段的值

filter {mutate {replace => { "filedName" => "new_value" }}
}

添加字段first,值为message数组的第一个元素的值

filter {mutate {split => ["message", "|"]add_field => {"first" => "%{[message][0]}"    } }
}

有条件的添加标签

filter {#在日志文件路径包含 access 的条件下添加标签内容if [path] =~ "access" {mutate {add_tag => ["Nginx Access Log"]}}#在日志文件路径是 /var/log/nginx/error.log 的条件下添加标签内容if [path] == "/var/log/nginx/error.log" {mutate {add_tag => ["Nginx Error Log"]}}}

3. multiline 多行合并插件

  java错误日志一般都是一条日志很多行的,会把堆栈信息打印出来,当经过 logstash 解析后,每一行都会当做一条记录存放到 ES, 那这种情况肯定是需要处理的。 这里就需要使用 multiline 插件,对属于同一个条日志的记录进行拼接。

3.1 安装 multiline 插件

#在线安装插件
cd /usr/share/logstash
bin/logstash-plugin install logstash-filter-multiline#离线安装插件
先在有网的机器上在线安装插件,然后打包,拷贝到服务器,执行安装命令
bin/logstash-plugin prepare-offline-pack --overwrite --output logstash-filter-multiline.zip logstash-filter-multilinebin/logstash-plugin install file:///usr/share/logstash/logstash-filter-multiline.zip

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xqDwdh3K-1689072382522)(C:\Users\86138\AppData\Roaming\Typora\typora-user-images\image-20230711173102236.png)]

#检查下插件是否安装成功,可以执行以下命令查看插件列表
bin/logstash-plugin list

在这里插入图片描述

3.2 使用 multiline 插件

#multiline插件执行过程
第一步:每一条日志的第一行开头都是一个时间,可以用时间的正则表达式匹配到第一行。
第二步:然后将后面每一行的日志与第一行合并。
第三步:当遇到某一行的开头是可以匹配正则表达式的时间的,就停止第一条日志的合并,开始合并第二条日志。
第四步:重复第二步和第三步。

在 Logstash 组件所在节点模拟 java 日志

cd /var/logvim java.log
2022-11-11 17:09:19.774[XNIo-1 task-1]ERROR com.passjava.controlle .NembercController-查询用户 活动数据失败,异常信息为:com.passjava.exception.MemberException: 当前没有配置活动规则at com.passjava.service.impL.queryAdmin(DailyServiceImpl.java:1444)at com.passjava.service.impl.dailyserviceImpL$$FastcLass
2022-11-11 17:10:56.256][KxNIo-1 task-1] ERROR com.passjava.controlle .NemberControl1er-查询员工 饭活动数据失败,异常信息为:com.passjava.exception.MemberException: 当前没有配置活动规则at com.passjava.service.impL.queryAdmin(DailyServiceImpl.java:1444)at com.passjava.service.impL.daiLyserviceImpL$$FastcLassll java.log			#查看执行权限

在这里插入图片描述

filter {multiline {pattern => "^\d{4}-\d{1,2}-\d{1,2}\s\d{1,2}:\d{1,2}:\d{1,2}.\d{3}"negate => truewhat => "previous"}
}#pattern:用来匹配文本的表达式,也可以是grok表达式#what:如果pattern匹配成功的话,那么匹配行是归属于上一个事件,还是归属于下一个事件。previous: 归属于上一个事件,向上合并。next: 归属于下一个事件,向下合并#negate:是否对pattern的结果取反。false:不取反,是默认值。true:取反。将多行事件扫描过程中的行匹配逻辑取反(如果pattern匹配失败,则认为当前行是多行事件的组成部分)

在这里插入图片描述

在这里插入图片描述

#浏览器访问并创建索引
浏览器访问 http://192.168.145.45:5601
第一次登录需要添加一个 Elasticsearch 索引:
Management -> Index Patterns -> Create index pattern
Index pattern 输入:java-*	#在索引名中输入之前配置的 Output 前缀“java”Next step -> Time Filter field name 选择 @timestamp -> Create index pattern单击 “Discover” 按钮可查看图表信息及日志信息。
数据展示可以分类显示,在“Available Fields”中的“host”,然后单击 “add”按钮,可以看到按照“host”筛选后的结果

在这里插入图片描述

4. date 时间处理插件

  用于分析字段中的日期,然后使用该日期或时间戳作为事件的logstash时间戳。

  在Logstash产生了一个Event对象的时候,会给该Event设置一个时间,字段为“@timestamp”,同时,我们的日志内容一般也会有时间,但是这两个时间是不一样的,因为日志内容的时间是该日志打印出来的时间,而 “@timestamp” 字段的时间是input插件接收到了一条数据并创建Event的时间,所以一般来说的话 “@timestamp” 的时间要比日志内容的时间晚一点,因为Logstash监控数据变化,数据输入,创建Event导致的时间延迟。这两个时间都可以使用,具体要根据自己的需求来定。

4.1 用法

filter {date {match => ["access_time", "dd/MMM/YYYY:HH:mm:ss Z", "UNIX", "yyyy-MM-dd HH:mm:ss", "dd-MMM-yyyy HH:mm:ss"]target => "@timestamp"timezone => "Asia/Shanghai"} 
}
#match
用于配置具体的匹配内容规则,前半部分内容表示匹配实际日志当中的时间戳的名称,后半部分则用于匹配实际日志当中的时间戳格式,这个地方是整条配置的核心内容,如果此处规则匹配是无效的,则生成后的日志时间戳将会被input插件读取的时间替代。
如果时间格式匹配失败,会生成一个tags字段,字段值为 _dateparsefailure,需要重新检查上边的match配置解析是否正确。#target
将匹配的时间戳存储到给定的目标字段中。如果未提供,则默认更新事件的@timestamp字段。#timezone
当需要配置的date里面没有时区信息,而且不是UTC时间,需要设置timezone参数。

4.2 时间戳详解

#年
yyyy  #全年号码。 例如:2015。
yy    #两位数年份。 例如:2015年的15。
#月
M     #最小数字月份。 例如:1 for January and 12 for December.。
MM    #两位数月份。 如果需要,填充零。 例如:01 for January  and 12 for Decembe
MMM   #缩短的月份文本。 例如: Jan for January。 注意:使用的语言取决于您的语言环境。 请参阅区域设置以了解如何更改语言。
MMMM  #全月文本,例如:January。 注意:使用的语言取决于您的语言环境。
#日
d   #最少数字的一天。 例如:1月份的第一天1。
dd  #两位数的日子,如果需要的话可以填零.例如:01 for the 1st of the month。
#时
H   #最小数字小时。 例如:0表示午夜。
HH  #两位数小时,如果需要填零。 例如:午夜00。
#分
m   #最小的数字分钟。 例如:0。
mm  #两位数分钟,如果需要填零。 例如:00。
#秒
s    #最小数字秒。 例如:0。
ss   #两位数字,如果需要填零。 例如:00。
#毫秒( 秒的小数部分最大精度是毫秒(SSS)。除此之外,零附加。)
S    #十分之一秒。例如:0为亚秒值012
SS   #百分之一秒 例如:01为亚秒值01
SSS  #千分之一秒 例如:012为亚秒值012
#时区偏移或身份
Z    #时区偏移,结构为HHmm(Zulu/UTC的小时和分钟偏移量)。例如:-0700。
ZZ   #时区偏移结构为HH:mm(小时偏移和分钟偏移之间的冒号)。 例如:-07:00。
ZZZ  #时区身份。例如:America/Los_Angeles。 注意:有效的ID在列表中列出http://joda-time.sourceforge.net/timezones.html

4.3 案例

192.168.80.10 - - [07/Feb/2022:16:24:19 +0800] “GET /HTTP/1.1403 5039

  现在我们想转换时间,那就要写出 dd/MMM/yyyy:HH:mm:ss Z

  你发现中间有三个M,你要是写出两个就不行了,因为两个大写的M表示两位数字的月份,可是我们要解析的文本中,月份则是使用简写的英文,所以只能去找三个M。还有最后为什么要加上个大写字母Z,因为要解析的文本中含有 +0800 时区偏移,因此我们要加上去,否则filter就不能正确解析文本数据,从而转换时间戳失败。

filter{grok{match => {"message" => ".* -\ -\ \[%{HTTPDATE:log_time}\]"}}date {match => ["log_time", "dd/MMM/YYYY:HH:mm:ss Z", "UNIX", "yyyy-MM-dd HH:mm:ss", "dd-MMM-yyyy HH:mm:ss"]target => "@timestamp"timezone => "Asia/Shanghai"} 
}

在这里插入图片描述

在这里插入图片描述

  在上面那段 rubydebug 编码格式的输出中,@timestamp 字段虽然已经获取了 timestamp 字段的时间,但是仍然比北京时间晚了8个小时,这是因为在 Elasticsearch 内部,对时间类型字段都是统一采用UTC时间,而日志统一采用UTC时间存储,是国际安全、运维界的一个共识。其实这并不影响什么,因为ELK已经给出了解决方案,那就是在Kibana平台上,程序会自动读取浏览器的当前时区,然后在web页面自动将UTC时间转换为当前时区的时间。

总结

1. ip地址(ipv4)的正则表达式

0-9			[0-9]
10-99		[1-9][0-9]
100-199		1[0-9][0-9]
200-249		2[0-4][0-9]
250-2552	5[0-5]即 [0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|5[0-5]

2. logstash filter过滤插件

grok 		将大文本字段进行分片成多个小字段   %{内置正则:字段名}    (?<字段名>自定义正则)
date 		将logstash收集的日志事件时间与实际记录的日志时间进行格式统一,需要配合grok模块使用
mutate 		对logstash收集的日志事件字段进行再处理,可以重命名,删除,替换和修改事件中的字段
multiline 	将多行日志内容合并成一整行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/18154.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git报错:remote: Access denied (URL 403)

git报错&#xff1a;remote: Access denied fatal: unable to access ‘ https:/ /gitee. cohe requested URL 403 大概的原因&#xff0c;是之前更改了 可能因为我之前在git bash中配过ssh&#xff0c;系统已经将指向git的用户设置了别的位置&#xff0c;所以…

基础篇--单片机简介

单片机简介 视频教程 单片机是什么 单片机&#xff1a;Single-Chip Microcomputer 单片微型计算机&#xff0c;是一种集成电路芯片 单片机有什么用&#xff1f; 单片机发展历程 单片机发展超势 CISC Vs RISC CISC和RISC举例 https://wenku.baidu.com/view/b074b0ed998fcc22b…

使用均值漂移来量化带宽分类数据

均值漂移概念 均值漂移的基本概念&#xff1a;沿着密度上升方向寻找聚簇点&#xff0c;其计算过程如下&#xff1a; 1 均值漂移算法首先找到一个中心点center&#xff08;随机选择&#xff09;&#xff0c;然后根据半径划分一个范围 把这个范围内的点输入簇x的标记个数加1 2 在…

【JavaEE】JVM的组成及类加载过程

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶 本文我们主要讲解一下面试中常见的问题&#xff0c;如果想深入了解&#xff0c;请看一下《Java虚拟机规范》这本书 目录 文章目录 一、JVM简介 二、JVM整体组成 2.1 运行时数据区组成 2.2…

ELK日志记录——Kibana组件——grok 正则捕获插件

grok 正则捕获插件 grok 使用文本片段切分的方式来切分日志事件 内置正则表达式调用 %{SYNTAX:SEMANTIC} ●SYNTAX代表匹配值的类型&#xff0c;例如&#xff0c;0.11可以NUMBER类型所匹配&#xff0c;10.222.22.25可以使用IP匹配。 ●SEMANTIC表示存储该值的一个变量声明&…

生产环境 kafka 平滑迁移之旅

文章目录 背景分析测试环境验证现实很残酷两种抉择-----leader分区切换方案选择实施步骤手工副本集增加步骤手工leader分区切换步骤 总结 背景 线上kafka集群&#xff0c;3台机器&#xff0c;3个broker&#xff1b;其中某台机器因为硬件故障&#xff0c;需要停机维修&#xff…

表的增删改查

1、创建表 mysql> create table employee ( -> id int(1) comment 员工编号, -> name varchar(6) comment 员工名字, -> gender varchar(2) comment 员工性别, -> salary int (4) comment 员工薪资); Query OK, 0 rows affected (0.01 sec) 2、…

解析三防平板在工业自动化的应用价值

三防平板作为一种具有出色性能和特殊设计的电子设备&#xff0c;为工业自动化领域带来了巨大的应用价值。采用英特尔凌动四核处理器&#xff0c;三防平板具备先进的技术与处理能力。同时配备Window 10操作系统&#xff0c;这款三防平板能够轻松执行多种任务指令。此外&#xff…

支持向量机推导之r||w||=1的限制转化

支持向量机推导之r||w||1的限制转化 很多同学肯定是学过支持向量机的&#xff0c;也可能大致的理解了支持向量机这个算法&#xff0c;我想大部分人在学习这个算法的时候&#xff0c;对于推导过程有一步应该是不太理解。 我先简要介绍一下SVM,SVM的核心思想在于找到一个多维空间…

基于深度学习的高精度深海鱼检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度深海鱼检测识别系统可用于检测与定位深海鱼目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的深海鱼目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型训练数据集&a…

python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)

简介 有些 post 的请求参数是 json 格式的&#xff0c;这个前面发送post 请求里面提到过&#xff0c;需要导入 json模块处理。现在企业公司一般常见的接口因为json数据容易处理&#xff0c;所以绝大多数返回数据也是 json 格式的&#xff0c;我们在做判断时候&#xff0c;往往只…

小白到运维工程师自学之路 第四十六集 (mongodb复制集)

一、概述 1、 MongoDB复制集&#xff08;MongoDB Replica Set&#xff09;是MongoDB提供的一种高可用性和数据冗余的解决方案。它由多个MongoDB实例组成&#xff0c;其中一个作为主节点&#xff08;Primary&#xff09;&#xff0c;其他节点则扮演从节点&#xff08;Secondary&…