文章目录
一、logstash文件输出
- logstash在采集数据完成后会把进度保存到sincedb文件中,假如我们选择将数据输出到elastic中,这时如果在elastic中将数据删除,然后用logstash采集同样的数据,这时候只会采集最新更改的信息,而之前重复的信息将不会被采集,这时候就可能造成数据的缺失
- 因此我们需要采集同样的信息并且把最新的数据也包含进去的话需要先删除对应的sincedb文件,然后再用logstash采集
- logstash保存进度到sincedb中是为了防止在重启logstash进行采集信息后,造成采集信息冗余
sincedb文件一共6个字段:
- inode编号
- 文件系统的主要设备号
- 文件系统的次要设备号
- 文件中的当前字节偏移量
- 最后一个活动时间戳(浮点数)
- 与此记录匹配的最后一个已知路径
[root@server1 logstash]# cd conf.d/
[root@server1 conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/demo.conf
[root@server1 conf.d]# cd /usr/share/logstash/data/plugins/inputs/file/
[root@server1 file]# l.
. .. .sincedb_452905a167cf4509fd08acb964fdb20c
[root@server1 file]# cat .sincedb_452905a167cf4509fd08acb964fdb20c
13398509 0 64768 287553 1622188993.191149 /var/log/messages
[root@server1 file]# cd /var/log/
[root@server1 log]# ls -i messages
13398509 messages
注意第一次采集的数据大小
未删除sincedb文件进行采集
数据大小很明显变小,采集信息有缺失。
在日志文件中添加信息
logstash可以同步采集,因为定义logstash采集的是系统的日志信息。
logstash新采集的保存在elasticsearch中的信息。
二、logstash伪装成日志服务器
利用Syslog输入插件,将logstash伪装成日志服务器,直接接受远程日志.
1. Syslog输入插件的使用
[root@server1 file]# cd /etc/logstash/conf.d/
[root@server1 conf.d]# ls
demo.conf
[root@server1 conf.d]# vim demo.conf
input {
syslog {
port => 514 #日志收集端口(默认的,可以不用添加)
}
}
[root@server1 conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/demo.conf
[root@server1 ~]# netstat -antlp | grep :514
tcp6 0 0 :::514 :::* LISTEN 4674/java
[root@server1 ~]# netstat -antulp | grep :514
tcp6 0 0 :::514 :::* LISTEN 4674/java
udp 0 0 0.0.0.0:514 0.0.0.0:* 4674/java
2.远程日志同步
将server2、server3上的日志远程同步到server1的logstash中
# server2 3 做同样操作
[root@server2 ~]# vim /etc/rsyslog.conf
[root@server2 ~]# systemctl restart rsyslog
日志上传到指定远程主机
保证server1上的logstash是开启状态
[root@server2 ~]# logger server2 ##server2上添加新日志信息
server3上做同样的配置即可
三、多行过滤插件
多行过滤可以把多行日志记录合并为一行事件
1.示例
[root@server1 conf.d]# pwd
/etc/logstash/conf.d
[root@server1 conf.d]# vim test.conf
input {
stdin {
codec => multiline { #多行录入
pattern => "^EOF" #以EOF开头
negate => true #是否匹配到,true表示匹配到了
what => previous #匹配到了之后要做的事情:previous表示向上合并
}
}
}
output {
stdout {}
}
[root@server1 conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/test.conf ##以指定文件启动logstash
符合条件向上合并,将输入合并成一行
2.采集完整日志信息
在特殊场景下,有些完整信息的输出是多行展示,这时候如果不设置这种向上匹配并合并输出的机制,则会导致采集的信息不完整
my-es.log作为采集信息示,因为这个文件中信息输出是多行的。
[root@server1 conf.d]# ll /var/log/elasticsearch/my-es.log
-rw-r--r-- 1 elasticsearch elasticsearch 89907 May 28 12:45 /var/log/elasticsearch/my-es.log
[root@server1 conf.d]# vim es.con
input {
file {
path => "/var/log/elasticsearch/my-es.log"
start_position => "beginning"
}
}
output {
stdout { }
elasticsearch {
hosts => ["192.168.0.1:9200"]
index => "eslog-%{+YYYY.MM.dd}"
}
}
[root@server1 conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/es.conf
查看采集到的信息,发现信息是不完整的
查看目标文件信息
[root@server1 ~]# cd /var/log/elasticsearch/
[root@server1 elasticsearch]# less my-es.log
指定匹配规则
[root@server1 conf.d]# vim es.conf
codec => multiline {
pattern => "^\["
negate => true
what => previous
}
[root@server1 conf.d]# cd /usr/share/logstash/data/plugins/
[root@server1 plugins]# ls
inputs
[root@server1 plugins]# cd inputs/file/
[root@server1 file]# ls
[root@server1 file]# l.
. .. .sincedb_452905a167cf4509fd08acb964fdb20c .sincedb_d5a86a03368aaadc80f9eeaddba3a9f5
[root@server1 file]# cat .sincedb_d5a86a03368aaadc80f9eeaddba3a9f5
5032853 0 64768 89907 1622194801.158707 /var/log/elasticsearch/my-es.log
[root@server1 file]# rm -fr .sincedb_d5a86a03368aaadc80f9eeaddba3a9f5
[root@server1 file]# l.
. .. .sincedb_452905a167cf4509fd08acb964fdb20c
[root@server1 file]# cat .sincedb_452905a167cf4509fd08acb964fdb20c
13398509 0 64768 287759 1622190845.260607 /var/log/messages
[root@server1 file]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/es.conf
采集前需要将之前的数据删除,并删除sincedb进度文件,以为能够采集到全部的数据。
采集完整信息
四、grok过滤插件
使用grok插件我们可以对采集的数据做预处理,过滤我们想要的信息
1.内核参数优化
[root@server1 7.6]# cd /proc/sys/vm/
[root@server1 vm]# cat swappiness
30
[root@server1 vm]# echo 10 > swappiness #减少swap的利用率,尽可能的使用物理内存,提高运行速度
[root@server1 vm]# cat swappiness
10
2.grok过滤
安装httpd,编辑测试页面
[root@server1 elasticsearch]# yum install -y httpd
[root@server1 elasticsearch]# systemctl start httpd
[root@server1 elasticsearch]# cd /var/www/html/
[root@server1 html]# ls
[root@server1 html]# echo server1 > index.html
[root@server1 html]# cat /var/log/httpd/access_log
做负载,产生日志
[root@foundation Desktop]# ab -c1 -n100 http://192.168.0.1/index.html
grok过滤示例
[root@server1 html]# chmod 755 /var/log/httpd/
[root@server1 html]# ll -d /var/log/httpd/
drwxr-xr-x 2 root root 41 May 28 18:49 /var/log/httpd/
[root@server1 html]# ll /var/log/httpd/access_log
-rw-r--r-- 1 root root 10200 May 28 18:51 /var/log/httpd/access_log
[root@server1 html]# cd /etc/logstash/conf.d/
[root@server1 conf.d]# ls
demo.conf es.conf test.conf
[root@server1 conf.d]# vim test.conf #编辑配置文件
input {
stdin {}
}
filter {
grok {
match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }
}
}
output {
stdout {}
}
[root@server1 conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/test.conf
55.3.244.1 GET /index.html 15824 0.043
输入的信息被分段截取,相当于做了预处理
编辑apache.conf文件,并进行logstash日志采集试验
[root@server1 patterns]# vim httpd
[root@server1 patterns]# pwd
/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-patterns-core-4.1.2/patterns
[root@server1 patterns]# ll httpd
-rw-r--r-- 1 logstash logstash 987 May 28 19:20 httpd
[root@server1 patterns]# vim /etc/httpd/conf/httpd.conf
[root@server1 patterns]# cd /etc/logstash/conf.d/
[root@server1 conf.d]# ls
apache.conf demo.conf es.conf test.conf
[root@server1 conf.d]# vim apache.conf
[root@server1 conf.d]# vim apache.conf
input {
file {
path => "/var/log/httpd/access_log"
start_position => "beginning"
}
}
filter {
grok {
match => { "message" => "%{ HTTPD_COMBINEDLOG }" }
}
}
output {
stdout { }
elasticsearch {
hosts => ["192.168.0.1:9200"]
index => "apachelog-%{+YYYY.MM.dd}"
}
}
[root@server1 conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/apache.conf
apache日志文件默认的日志定制格式
查看采集到的信息,信息已做过预处理,字段信息全部单独被截取出来