ELK日志采集系统构建实战讲解,让小伙伴更深入的理解ELK。


1 、首先确保服务器已经运行了 ES 集群

 




ELK 收集Windows日志 elk日志采集_elasticsearch


 



ELK 收集Windows日志 elk日志采集_正则表达式_02


2 、确保服务器上已经安装部署了 logstash


 



ELK 收集Windows日志 elk日志采集_服务器_03


 


3 、在 Logstash 安装路径下的 config 目录中,新建一个 conf 文件,取名为 es_log.conf,并且填入以下内容:


 



ELK 收集Windows日志 elk日志采集_ELK 收集Windows日志_04


 


input { 
  
file { 
  
path => "/home/elk/elk/teaching/elasticsearch-7.7.0/logs/my-elk.log" 
  
start_position => "beginning" 
  
codec => multiline { 
  
pattern => "^\[" 
  
negate => true   what => "previous" 
  
    } 
  
  } 
  
}
  
output { 
  
elasticsearch { 
  
hosts => ["http://172.18.194.140:9200"] 
  
index => "es-log-%{+YYYY.MM.dd}" 
  
  }
  
stdout{} 
  
}


4 、进入 Logstash 的 bin 目录执行 ./logstash -f ../config/es_log.conf


5 、控制台会输出:


 



ELK 收集Windows日志 elk日志采集_正则表达式_05


 


 


6 、我们到浏览器查询:


 



ELK 收集Windows日志 elk日志采集_elasticsearch_06


 


发现 ES 中确实创建了一个索引 es-log-2020.07.08


7 、在 ES 中查询这个索引的内容


 



ELK 收集Windows日志 elk日志采集_elasticsearch_07


8 、仔细检查存入的日志内容,发现日志信息是作为整体存入 message 字 段的:


 



ELK 收集Windows日志 elk日志采集_elasticsearch_08


 


有没有办法存入的更细粒些呢?


9 、仔细分析 es 的日志,呈现了一定的结构化特征:


 



ELK 收集Windows日志 elk日志采集_ELK 收集Windows日志_09


总是: “ [ 时间戳 ][ 日志级别 ][ 输出信息的类名 ][ 节点名 ] 具体的日志信息 ”这种格式,所以我们完全可以考虑使用过滤器插件对文本进行分析后再存 入 es ,怎么分析?可以用 grok 过滤器。


10 、 在 Logstash 安装路径下的 config 目录中,新建一个 conf 文件,取名 为 log_grok.conf ,并且填入以下内容:


ELK 收集Windows日志 elk日志采集_正则表达式_10


input { 
 
file { 
 
path => "/home/elk/elk/teaching/elasticsearch-7.7.0/logs/my-elk.log" 
 
start_position => "beginning" 
 
codec => multiline { 
 
pattern => "^\[" 
 
negate => true 
 
what => "previous" 
 
      } 
 
   } 
 
}
 
filter{ 
 
grok { 
 
match => {  message => 
 
"\[%{TIMESTAMP_ISO8601:time}\]\[%{LOGLEVEL:level}%{SPACE}\]\[%{NOT 
 
SPACE:loggerclass}%{SPACE}\]%{SPACE}\[%{DATA:nodename}\]%{SPACE} 
 
%{GREEDYDATA:msg}" 
 
     } 
 
  } 
 
}
 
output { 
 
stdout{} 
 
}


11 、如果担心自己写的 conf 有语法问题,可以执行 ./logstash -f xxxxxxx.conf -t 检查 conf ,当然只能检查语法,不能检查诸如


正则表达式是否正确这类问题。


ELK 收集Windows日志 elk日志采集_服务器_11


12 、执行 ./logstash -f ../config/log_grok.conf ,如果发现程序没有输出,有 可能是 elk 的日志文件已经被处理过, logstash 不会重复处理,这时可以到 logstash 的 /data/plugins/inputs/file 目录下,删除 .sincedb 文件(这个文件是个 隐藏文件),再执行。


 

ELK 收集Windows日志 elk日志采集_服务器_12


 



ELK 收集Windows日志 elk日志采集_正则表达式_13


可以看见,每条日志已经成功的被解析了。


13 、现在考虑如何存入 es ,按照原来的


ELK 收集Windows日志 elk日志采集_正则表达式_14


 


ELK 收集Windows日志 elk日志采集_服务器_15

定义好索引的 mapping(映射),注意要和我们对日志的分解一一对应。


14 、创建一个新的 conf 文件,取名 es_log_grok.conf ,内容如下:


ELK 收集Windows日志 elk日志采集_ELK 收集Windows日志_16


input { 
 
file { 
 
path => "/home/elk/elk/teaching/elasticsearch-7.7.0/logs/my-elk.log" 
 
start_position => "beginning" 
 
codec => multiline { 
 
pattern => "^\[" 
 
negate => true 
 
what => "previous" 
 
      } 
 
   } 
 
}
 
filter{ 
 
grok { 
 
match => { 
 
message => 
 
"\[%{TIMESTAMP_ISO8601:time}\]\[%{LOGLEVEL:level}%{SPACE}\]\[%{NOT 
 
SPACE:loggerclass}%{SPACE}\]%{SPACE}\[%{DATA:nodename}\]%{SPACE} 
 
%{GREEDYDATA:msg}" 
 
       } 
 
   } 
 
}
 
output { 
 
elasticsearch { 
 
hosts => ["http://172.18.194.140:9200"] 
 
index => "es-log-text-%{+YYYY.MM.dd}" 
 
template_name => "es_template*" 
 
template => "/home/elk/elk/teaching/logstash-7.7.0/config" 
 
}
 
stdout{} 
 
}


主要是在 elasticsearch 插件中增加了对刚才新增的 json 文件的读取。


15 、执行 ./logstash -f ../config/es_log_grok.conf ,会看到控制台的输出,同 时在浏览器中,也会看到解析后的日志:


ELK 收集Windows日志 elk日志采集_服务器_17

ELK实战demo到此结束,下一篇我们分析es的性能优化策略,敬请期待。