2021年02月搭建Docker的ELK堆栈
首先
对呀,就是ELK Stack。
因为还没有安装Beats,所以可能不能算作完整的Elastic Stack吧。
我参考了以下文章进行学习,尝试进行建设。
- DockerでELK(Elasticsearch Logstash Kibana) を構築してみました
这次使用的东西
我们基于Docker已经安装完成的前提来进行操作。
开始构建
创建一个作业文件夹
我会创建一个作业文件夹。
$ mkdir elkwork
$ cd elkwork
创建一个与Docker共享的文件夹。
$ sudo mkdir -p /data/elk
我会更改elk文件夹的所有者。
示例中使用了user:user,但我使用了myname:staff(其中myname是我的用户名)。
$ sudo chown user:user data/elk
从这里开始,在elk文件夹下创建共享文件夹。
首先,创建一个用于elasticsearch的共享文件夹。
$ mkdir data/elk/elasticsearch
接下来,我们要创建一个用于logstash的共享文件夹。
$ mkdir -p data/elk/logstash/pipeline
最后,创建一个用于nginx的共享文件夹。
$ mkdir -p data/elk/log/nginx
启动nginx。
启动Nginx。
在指定Nginx共享文件夹时遇到了错误,但已经解决。2
$ docker run -d --restart always -v /Users/myname/Downloads/elkwork/data/elk/log/nginx:/var/log/nginx -p 80:80 nginx:1.19.7-alpine
我会确认nginx是否已启动。
启动Elasticsearch。
我要启动elasticsearch。
$ docker run -d --restart always -v /Users/myname/Downloads/elkwork/data/elk/elasticsearch:/usr/share/elasticsearch/data -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" --name elasticsearch docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.1
确认Elasticsearch已启动。
只要返回JSON即可。
{
"name" : "34db2f5a288c",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "RZ9UOc4TTv-28XD7Kw5Nqw",
"version" : {
"number" : "7.10.1",
"build_flavor" : "oss",
"build_type" : "docker",
"build_hash" : "1c34507e66d7db1211f66f3513706fdf548736aa",
"build_date" : "2020-12-05T01:00:33.671820Z",
"build_snapshot" : false,
"lucene_version" : "8.7.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
启动Logstash
将Logstash的配置文件(conf文件)创建在data/elk/logstash/pipeline文件夹下。
input {
file {
path => "/var/log/nginx/access.log"
start_position => beginning
}
}
filter {
grok {
match => { "message" => ["%{IPORHOST:[nginx][access][remote_ip]} - %{DATA:[nginx][access][user_name]} \[%{HTTPDATE:[nginx][access][time]}\] \"%{WORD:[nginx][access][method]} %{DATA:[nginx][access][url]} HTTP/%{NUMBER:[nginx][access][http_version]}\" %{NUMBER:[nginx][access][response_code]} %{NUMBER:[nginx][access][body_sent][bytes]} \"%{DATA:[nginx][access][referrer]}\" \"%{DATA:[nginx][access][agent]}\""] }
remove_field => "message"
}
mutate {
add_field => { "read_timestamp" => "%{@timestamp}" }
}
date {
match => [ "[nginx][access][time]", "dd/MM/YYYY:H:m:s Z" ]
remove_field => "[nginx][access][time]"
}
useragent {
source => "[nginx][access][agent]"
target => "[nginx][access][user_agent]"
remove_field => "[nginx][access][agent]"
}
geoip {
source => "[nginx][access][remote_ip]"
target => "[nginx][access][geoip]"
}
}
output {
elasticsearch {
hosts => [ 'elasticsearch' ]
index => "access_log1"
}
}
开始运行logstash。
$ docker run -d --restart always -v /Users/myname/Downloads/elkwork/data/elk/logstash/pipeline:/usr/share/logstash/pipeline -v /Users/myname/Downloads/elkwork/data/elk/log:/var/log --link elasticsearch:elasticsearch --name logstash docker.elastic.co/logstash/logstash-oss:7.10.1
我将启动Logstash,并确认日志已被传输。
从内容看,非常好奇是否已正确传输。
我将对其进行格式化,以便更易于查看。
{
"error":{
"root_cause":[{
"type":"index_not_found_exception",
"reason":"no such index [access_log1]",
"resource.type":"index_or_alias",
"resource.id":"access_log1",
"index_uuid":"_na_",
"index":"access_log1"
}],
"type":"index_not_found_exception",
"reason":"no such index [access_log1]",
"resource.type":"index_or_alias",
"resource.id":"access_log1",
"index_uuid":"_na_",
"index":"access_log1"
},
"status":404
}
5. 启动Kibana
启动Kibana。
$ docker run -d --restart always -p 5601:5601 --link elasticsearch:elasticsearch -e ELASTICSEARCH_URL=http://elasticsearch:9200 --name kibana docker.elastic.co/kibana/kibana-oss:7.10.1
确认Kibana已启动3。
确定已启动的ELK堆栈是否正常运行。
在Kibana中,确认从Logstash传输日志。
通过左侧的汉堡按钮,打开Dev Tool。
在控制台上输入以下命令:GET /access_log1/_search?pretty=true
输入后,点击 ▶。
如果在右侧看到200 – OK并显示了访问日志,那就说明完美了。
各种确认
状态
可以通过http://localhost:5601/status来确认。
设置索引模式。
据说需要先创建Elasticsearch索引才能使用Kibana。
点击“创建索引模式”并跳转。
需要在Index pattern name的位置上指定一个或多个与Elasticsearch索引名称匹配的Index Pattern。
在下面,显示了”access_log1″,因此使用它作为Index Pattern看起来是一个好选择。
当您选择指定“access*”时,”下一步 >”将被启用。
听起来不错。
从包含时间戳的索引字段中进行选择。
通过时间字段下拉菜单进行选择。
选择”@timestamp”,然后点击”创建索引模式”。
看起来,注册好像成功了。
我打算切换到Discover,看看情况。
调整一下时间范围,就能清楚地看到了。哈哈,看过的画面。
总结
集装箱真是方便呀…
之后,我会用它来学习很多东西。
不仅是学习构建,还要考虑一下ELK可以做什么,这也是学习的一部分。
我在使用指定用户时遇到了错误。因为用户组名不合法,所以我将其更改为myname:staff。目前还没有发现错误。我正在使用Mac。
原本我指定了data/elk/log/nginx:/var/log/nginx,但是会返回”Error response from daemon”。我理解需要指定完整路径,所以按照说明书上的写法来消除错误。参考链接:注意在docker run中挂载主机操作系统目录的时候。
如果立即通过URL进行确认,则会收到”还未完成”的提醒。请喝一口咖啡,冷静之后再进行访问。