1 继续安装ELK
上文已经安装了ELK三大件中的两个软件elasticsearch和kibana。 在此基础上,在同一个机器上再安装logstash, 完成三大件的安装。
-
(非root用户)登录linux,下载最新的logstash安装包 下载地址https://www.elastic.co/cn/downloads/elasticsearch 。然后解压即可
cd /home/zyplanke/elk curl -L -O https://artifacts.elastic.co/downloads/logstash/logstash-6.8.3.tar.gz tar -xvf logstash-6.8.3.tar.gz
2 安装filebeat
filebeat通常与日志源服务器放同一台机器上。因此我们在另一台跑业务(有业务日志)的Linux机器上安装filebeat。
如果是收集业务系统的日志,确保filebeat对日志文件具有读权限。
-
登录业务系统(通常可使用业务系统的用户)载最新的filebeat安装包 下载地址https://www.elastic.co/cn/downloads/elasticsearch
cd /home/zyplanke/elk curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.8.3-linux-x86_64.tar.gz tar -xvf filebeat-6.8.3-linux-x86_64.tar.gz
3 配置日志文件采集
filebeat从日志源采集日志数据,通过网络发给logstash,logstash将数据进行处理后发给elasticsearch。
前面已经将elasticsearch和kibana,下面分别配置filebeat和logstash。
3.1 配置filebeat
编辑filebeat.yml, 内容如下
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/*.log
fields:
logcategory: oslog
#output.elasticsearch: 由于我们filebeat不直接发给elasticsearch,所有注释本配置。
# hosts: ["localhost:9200"]
output.logstash:
hosts: ["192.168.43.201:5044"]
上面的filebeat配置:
- input表示,filebeat从指定的目录和文件作为采集的日志源(路径和文件名支持星号模糊匹配。 注意必须有被采集文件的读权限)。必须enabled为true,否则不生效。 可以配置多个input。
- 而fields是自己定义的字段(并赋值),方便后续处理。
- output表示,filebeat将采集的日志(加上fileds、tag及其他属性)后,将起传输到logstash
3.2 配置logstash
在config目录中,以复制logstash-sample.conf样例文件,得到文件logstash_file.conf。
编辑config/logstash_file.conf,内容如下
input {
beats {
port => 5044
}
}
output {
elasticsearch {
hosts => ["http://192.168.43.201:9200"]
index => "%{[fields][logcategory]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
#user => "elastic"
#password => "changeme"
}
}
上面logstash_file.conf配置的:
- input:logstash从filebeat接收数据的本地端口。
- filter(可选):进行转换改变
- output:logstash结果传输到哪里(这里定义为传输到elasticsearch,若elasticsearch集群有多个节点则hosts内容应多个)。同时配置了索引名。注意这里使用了filebeat自定义字段。
3.3 启动
- 启动logstash。
./logstash -f ../config/logstash_file.conf
启动需要多等一小会。
- 启动filebeat。 ./filebeat -e -c 配置文件名 -e输出到标准输出,默认输出到syslog和logs下 -c 指定配置文件
./filebeat -e -c filebeat.yml
默认filebeat会在当前目录创建data目录,里面存放了每个采集文件的名字和坐标(偏移量),这样可以在filebeat重启后支持断点续传。
如果希望filebeat全部重新传输,则可以把filebeat下整个data目录删除(可能在elasticsearch中也要删除。),让filebeat觉得从来都没有传输过。
附:为了便于filebeat的启停管理,写了一个名为:run_filebeat.sh的Shell脚本供使用
##################################################################################
# desc: FileBeat运行管理脚本
###################################################################################
CURR_PWD=`pwd -P`
Usage()
{
echo "*******************************************************"
echo " Usage: "
echo " `basename $0` : print this usage info "
echo " `basename $0` show : show current running process "
echo " `basename $0` start : start process"
echo " `basename $0` stop : stop process"
echo " `basename $0` kill : froce kill process"
echo ""
exit 0
}
#判断参数的参数个数,如果不符合要求,则输出用法提示
if [ $# -ne 1 ];then
Usage
fi
case $1 in
"show") # 显示当前正运行的进程
echo ""
echo " Currently, running processes as follows....."
echo "*******************************************************"
#ps -f | head -1
ps -f -u `whoami` | grep -w "filebeat" | grep -v "grep" | awk '{print $2}' |xargs -r pwdx | grep -w "${CURR_PWD}" | awk -F: '{print $1}' | xargs -r ps -f -p | grep -v "grep"
echo "*******************************************************"
echo ""
;;
"start")
nohup ${CURR_PWD}/filebeat -e -c filebeat.yml &
echo " starting... "
sleep 1
echo " Please check the result via logs files or nohup.out!"
echo ""
;;
"stop")
ps -f -u `whoami` | grep -w "filebeat" | grep -v "grep" | awk '{print $2}' |xargs -r pwdx | grep -w "${CURR_PWD}" | awk -F: '{print $1}' | xargs -r kill > /dev/null 2>&1
echo " stoping... "
sleep 1
echo " Please check the result by yourself!"
echo ""
;;
"kill")
ps -f -u `whoami` | grep -w "filebeat" | grep -v "grep" | awk '{print $2}' |xargs -r pwdx | grep -w "${CURR_PWD}" | awk -F: '{print $1}' | xargs -r kill > /dev/null 2>&1
sleep 5
ps -f -u `whoami` | grep -w "filebeat" | grep -v "grep" | awk '{print $2}' |xargs -r pwdx | grep -w "${CURR_PWD}" | awk -F: '{print $1}' | xargs -r kill -9 > /dev/null 2>&1
;;
*)
echo " input error!!! "
Usage
;;
esac
exit 0
3.4 检查结果
当filebeat、logstash、elasticsearch、kibana都启动后。日志会自动采集,并存放到elasticsearch中。通过kibana可以查看结果:
注意:该index的health为yellow是因为,logstash向elasticsearch创建index时指定了number_of_replicas=1,既处理主数据外至少还需要一个副本。
而elasticsearch要求副本应分散在不同的节点node上,这样安全避免单节点故障而丢失数据。因本环境elasticsearch只有一个node,所有health为yellow。如果把该index的设置Setting中,“number_of_replicas” 改为 “0”。则health就会变为green。
3.5 搜索结果(文档)
在源日志中,有/var/log/vmware-vmsvc.log日志文件,该文件里面的数据为:
在kibana里“Dev Tools”中通过RESTfull API 模糊搜索
GET /oslog-6.8.3-2020.06.25/_search
{
"query": { "match": { "log.file.path": "vmsvc.log" } },
"sort": [
{
"@timestamp": {
"order": "asc"
}
}
]
}
搜索结果如下图,在message集中就是vmware-vmsvc.log的日志内容。
3.6 字段拆分过滤
- 上面的message是日志的每一行,实际上日志每行的内容是有规律的,可以进行切割,以便精确的进行分析。
其他不变。编辑config/logstash_file.conf,增加filter内容如下
input {
beats {
port => 5044
}
}
filter {
mutate {
split => {"message"=>"Z]"}
}
mutate {
add_field => {
"datetime" => "%{[message][0]}"
"msg" => "%{[message][1]}"
}
}
mutate {
convert => {
"datetime" => "string"
"msg" => "string"
}
}
mutate {
lowercase => ["[fields][logcategory]"]
}
}
output {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "%{[fields][logcategory]}-aftersplit-%{+YYYY.MM.dd}"
#user => "elastic"
#password => "changeme"
}
}
mutate(该单词意思为变化):
- split:指定对什么内容进行切割,并指定分隔符。
- add_field:增加哪些自定义字段,而且设置了其值从获得(从切割后的数组中获得)
- convert:将字段转换为什么类型。
- lowercase: 将指定的字段中的值转为小写。因为elasticsearch中的index名只允许为小写。
- 启动logstash。
./logstash -f ../config/logstash_file.conf
启动需要多等一小会。
-
启动filebeat。
默认filebeat会在当前目录创建data目录,里面存放了每个采集文件的名字和坐标(偏移量),这样可以在filebeat重启后支持断点续传。
如果希望filebeat全部重新传输,则可以把filebeat下整个data目录删除(可能在elasticsearch中也要删除。),让filebeat觉得从来都没有传输过。
rm data
./filebeat -e -c filebeat.yml
搜索结果(文档)
在kibana里“Dev Tools”中通过RESTfull API 模糊搜索(根据logstash的配置,index的名字为:oslog-aftersplit-2020.06.25)
GET /oslog-aftersplit-2020.06.25/_search
{
"query": { "match": { "log.file.path": "vmsvc.log" } },
"sort": [
{
"@timestamp": {
"order": "asc"
}
}
]
}
搜索结果如下图,可以看到拆分后的字段:datatime和msg已经正确的赋值。。
3.7 修改index默认设置_setting
以上通过logstash在elasticsearch中创建的索引,都是默认设置的属性。 如果希望改变logstash在elasticsearch创建的索引设置,例如number_of_shards、number_of_replicas等等。 我们不能直接在logstash.conf文件中配置(因为没有直接的选项)。而是:
1、先创建一个template.json
文件,在文件中编辑一下内容:
{
"template" : "*",
"settings" : {
"number_of_shards": 2,
"number_of_replicas": 0
}
}
2、然后在logstash.conf文件中增加template
、template_overwrite
两项配置。类似如下:
(省略其他)
output {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "%{[fields][logcategory]}-aftersplit-%{+YYYY.MM.dd}"
template => "/home/zyplanke/elk/logstash-6.8.3/config/template.json"
template_overwrite => "true"
#user => "elastic"
#password => "changeme"
}
(省略其他)
3、重启logstash即可,新创建的索引自动会使用template.json
文件定义的设置。