运行环境
测试环境只有一台服务器,本文的elk运行在同一台机器下。
- 操作系统:Centos 7.4
- elasticsearch:5.5.1
- logstash:5.5.1
- kibana:5.5.1
环境准备
1、关闭防火墙
systemctl disable firewalld
systemctl stop firewalld
2、关闭selinux
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
3、修改limits.conf
vim /etc/security/limits.conf
es soft memlock unlimited
es hard memlock unlimitez
es soft nofile 65536
es hard nofile 65536
4、修改vm.max_map_count值
sysctl -w vm.max_map_count=262144
安装elasticsearch
1.解压安装包,并添加es用户:
mkdir -p /opt/elk/
tar zxf elasticsearch-5.5.1.tar.gz -C /opt/elk/
useradd es
echo "es" | passwd --stdin es
chown -R es:es /opt/elk/elasticsearch-5.5.1
2.修改elasticsearch.yml文件,添加以下参数:
cluster.name: es_cluster
node.name: es01
path.data: /opt/elk/elasticsearch-5.5.1/data
path.logs: /opt/elk/elasticsearch-5.5.1/logs
network.host: 192.168.30.52
discovery.zen.ping.unicast.hosts: ["192.168.30.52"]
node.master: true
node.data: true
3.启动elasticsearch:
su - es
/opt/elk/elasticsearch-5.5.1/bin/elasticsearch -d
4.验证elasticsearch:
curl -X GET http://192.168.30.52:9200/
{
"name" : "es01",
"cluster_name" : "es_cluster",
"cluster_uuid" : "avD7bV4mQeqc7FZY0wHHsA",
"version" : {
"number" : "5.5.1",
"build_hash" : "19c13d0",
"build_date" : "2017-07-18T20:44:24.823Z",
"build_snapshot" : false,
"lucene_version" : "6.6.0"
},
"tagline" : "You Know, for Search"
}
安装logstash
1.解压安装包:
tar zxf logstash-5.5.1.tar.gz -C /opt/elk/
2.创建配置文件:
vim config/logstash_synframe.conf
input {
file {
codec => multiline {
pattern => "^\s"
what => "previous"
}
path => "/opt/tomcat/logs/catalina.out"
start_position => "beginning"
}
}
filter {
grok {
patterns_dir => "/opt/elk/logstash-5.5.1/logstash-patterns"
match => {
"message" => ["%{MYLOG}", "%{TOMCATLOG}"]
}
overwrite => ["message"]
}
mutate {
add_field => { "log_ip" => "192.168.30.52" }
remove_field => [ "tags", "@version", "path", "host" ]
}
}
output {
elasticsearch {
index => "tomcat-synframe-%{+YYYY.MM.dd}"
document_type => "tomcat_synframe"
template => "/opt/elk/logstash-5.5.1/config/synframe_template.json"
template_name => "synframe_template"
template_overwrite => true
hosts => ["192.168.30.52:9200"]
}
}
配置文件调用了logstash-patterns目录的正则匹配规则,需要创建目录和正则文件:
mkdir /opt/elk/logstash-5.5.1/logstash-patterns
cd /opt/elk/logstash-5.5.1/logstash-patterns
vim java.pattern
JAVACLASS (?:[a-zA-Z$_][a-zA-Z$_0-9]*\.)*[a-zA-Z$_][a-zA-Z$_0-9]*
#Space is an allowed character to match special cases like 'Native Method' or 'Unknown Source'
JAVAFILE (?:[A-Za-z0-9_. -]+)
#Allow special <init> method
JAVAMETHOD (?:(<init>)|[a-zA-Z$_][a-zA-Z$_0-9]*)
#Line number is optional in special cases 'Native method' or 'Unknown source'
JAVASTACKTRACEPART %{SPACE}at %{JAVACLASS:class}\.%{JAVAMETHOD:method}\(%{JAVAFILE:file}(?::%{NUMBER:line})?\)
# Java Logs
JAVATHREAD (?:[A-Z]{2}-Processor[\d]+)
JAVACLASS (?:[a-zA-Z0-9-]+\.)+[A-Za-z0-9$]+
JAVAFILE (?:[A-Za-z0-9_.-]+)
JAVASTACKTRACEPART at %{JAVACLASS:class}\.%{WORD:method}\(%{JAVAFILE:file}:%{NUMBER:line}\)
JAVALOGMESSAGE (.*)
# MMM dd, yyyy HH:mm:ss eg: Jan 9, 2014 7:13:13 AM
CATALINA_DATESTAMP %{MONTH} %{MONTHDAY}, 20%{YEAR} %{HOUR}:?%{MINUTE}(?::?%{SECOND}) (?:AM|PM)
# yyyy-MM-dd HH:mm:ss,SSS ZZZ eg: 2014-01-09 17:32:25,527 -0800
TOMCAT_DATESTAMP 20%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{HOUR}:?%{MINUTE}(?::?%{SECOND}) %{ISO8601_TIMEZONE}
CATALINALOG %{CATALINA_DATESTAMP:timestamp} %{JAVACLASS:class} %{JAVALOGMESSAGE:logmessage}
# 2014-01-09 20:03:28,269 -0800 | ERROR | com.example.service.ExampleService - something compeletely unexpected happened...
TOMCATLOG %{TOMCAT_DATESTAMP:timestamp} \| %{LOGLEVEL:level} \| %{JAVACLASS:class} - %{JAVALOGMESSAGE:logmessage}
# 自定义
# 2020-07-01 15:36:24.583 INFO PID --- Root WebApplicationContext: initialization started
MYTIMESTAMP 20%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{HOUR}:?%{MINUTE}(?::?%{SECOND})
PID ([0-9]+)
MYLOG %{MYTIMESTAMP:mytimestamp} %{LOGLEVEL:level} %{PID:pid} --- %{JAVALOGMESSAGE:logmsg}
Logstash 官网提供了很多可以拿来即用的正则表达式,详细请参考 github 项目:https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns
而具体的正则需要根据应用日志修改,如本文测试环境tomcat日志格式如:
2020-07-01 15:51:34.312 DEBUG 30600 --- [nio-8080-exec-1] c.f.s.c.u.clientinfo.ClientInfoFilter : 当前请求URL是xxx
那么日志分为时间、level、pid、详细信息:
%{MYTIMESTAMP:mytimestamp} %{LOGLEVEL:level} %{PID:pid} --- %{JAVALOGMESSAGE:logmsg}
另外,配置文件输入到es时指定了es索引的模板,需要创建模板:
vim config/synframe_template.json
{
"template": "tomcat-synframe-*",
"order": 1,
"settings": {
"number_of_shards": 1,
"index.refresh_interval": "60s",
"number_of_replicas": 0
},
"mappings": {
"tomcat_synframe" : {
"properties" : {
"@timestamp" : { "type" : "date" }
}
}
}
}
因为本文测试环境只有一个es节点,故设置分片数为1,副本数为0。而生产环境应该设置至少三份副本,分片数看具体节点数配置。
3.启动logstash
nohup ./bin/logstash -w 1 -b 1000 -f /opt/elk/logstash-5.5.1/config/logstash_synframe.conf &> /opt/elk/logstash-5.5.1/logstash.log &
启动后,如logstash.log没异常信息,那么lostash已经将tomcat的日志收集到elasticsearch里,可通过curl http://192.168.30.52:9200/_cat/shards?v
查看es的索引信息。
安装kibana
1.解压安装包
tar zxf kibana-5.5.1-linux-x86_64.tar.gz -C /opt/elk/
2.修改配置文件
vim config/kibana.yml
server.port: 5601
server.host: "192.168.30.52"
elasticsearch.url: "http://192.168.30.52:9200"
3.启动kibana
nohup bin/kibana &
4.添加索引
浏览器打开192.168.30.52:5601/app/kibana,如果第一次访问,那么需要添加索引
索引名称是es创建的tomcat-synframe-*,添加后,可以在discover界面查看索引信息
目前kibana没有认证访问,后续需要添加nginx服务,通过nginx提供认证访问。