一,EKL介绍
1.1 需求背景
一般我们需要进行日志分析场景:直接在日志文件中 grep、awk 就可以获得自己想要的信息。但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。需要集中化的日志管理,所有服务器上的日志收集汇总。常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。
一般大型系统是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。
一个完整的集中式日志系统,需要包含以下几个主要特点:
收集-能够采集多种来源的日志数据
传输-能够稳定的把日志数据传输到中央系统
存储-如何存储日志数据
分析-可以支持 UI 分析
警告-能够提供错误报告,监控机制ELK提供了一整套解决方案,并且都是开源软件,之间互相配合使用,完美衔接,高效的满足了很多场合的应用。目前主流的一种日志系统。
1.2 ELKStack介绍
Logstash : 开源的服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据存储到数据库中。
Elasticsearch:搜索,分析和存储数据,分布式数据库。
Kibana:数据可视化。
Beats:轻量型采集器的平台,从边缘机器向Logstash和Elasticsearch发送数据。
Filebeat:轻量型日志采集器。
https://www.elastic.co/cn/
https://www.elastic.co/subscriptions
1.3 ELK Stack架构
Input:输入,输出数据可以是Stdin,File,TCP,Redis,Syslog等
Filter:过滤,将日志格式化。有丰富的过滤插件:Grok正则捕获,Date时间处理,Json编码解码,Mutate数据修改等
Output:输出,输出目标可以是Stdout,File,TCP,Redis,ES等
二,环境部署
主机名 | IP | 备注 |
---|---|---|
elkstack | 192.168.200.70 | 内存3G |
ELK所有包
链接:https://pan.baidu.com/s/1PTUOKy5MNXYIhSUkkbb-DA
提取码:fa6n
2.1 环境要求
cat /etc/redhat-release
uname -r
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
2.2 安装jdk环境
ls
tar xf jdk-8u60-linux-x64.tar.gz -C /usr/local/
mv /usr/local/jdk1.8.0_60 /usr/local/jdk
2.3 配置java环境变量
vim /etc/profile
tail -3 /etc/profile
export JAVA_HOME=/usr/local/jdk/
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
source /etc/profile
java -version
三,kibana的安装和启动
3.1 kibana下载地址
kibana主要用来展现数据,它本身不存储数据
https://artifacts.elastic.co/downloads/kibana/kibana-6.2.3-linux-x86_64.tar.gz
3.2 编译部署kibana
useradd -s /sbin/nologin -M elk
ls
tar xf kibana-6.2.3-linux-x86_64.tar.gz -C /usr/local/
mv /usr/local/kibana-6.2.3-linux-x86_64 /usr/local/kibana
3.3 kibana配置文件修改
修改以下配置文件
cat -n /usr/local/kibana/config/kibana.yml | sed -n '2p;7p;21p;39p;40p'
2 #server.port: 5601
7 #server.host: "localhost"
21 #elasticsearch.url: "http://localhost:9200"
39 #elasticsearch.username: "user"
40 #elasticsearch.password: "pass"
修改成如下配置文件
vim /usr/local/kibana/config/kibana.yml
cat -n /usr/local/kibana/config/kibana.yml | sed -n '2p;7p;21p;39p;40p'
2 server.port: 5601 #暂时就先修改这两行
7 server.host: "0.0.0.0" #暂时就先修改这两行
21 #elasticsearch.url: "http://localhost:9200"
39 #elasticsearch.username: "user"
40 #elasticsearch.password: "pass"
3.4 把kibana目录改为elk用户
chown -R elk:elk /usr/local/kibana/
3.5 新增启动脚本vim /usr/local/kibana/bin/start.sh
vim /usr/local/kibana/bin/start.sh
cat /usr/local/kibana/bin/start.sh
nohup /usr/local/kibana/bin/kibana >> /tmp/kibana.log 2>> /tmp/kibana.log &
chmod a+x /usr/local/kibana/bin/start.sh
3.6 用普通用户启动kibana
su -s /bin/bash elk '/usr/local/kibana/bin/start.sh'
ps -ef | grep elk | grep -v grep
如果有防火墙需要开放tcp5601端口
3.7 查看错误日志
cat /tmp/kibana.log | grep warning | head -5
这里有个警告,意思是连接不上elasticsearch,忽略,因为我们还没有装它。
{"type":"log","@timestamp":"2019-01-03T14:12:30Z","tags":["warning","elasticsearch","admin"],"pid":1451,"message":"Unable to revive connection: http://localhost:9200/"}
{"type":"log","@timestamp":"2019-01-03T14:12:30Z","tags":["warning","elasticsearch","admin"],"pid":1451,"message":"No living connections"}
{"type":"log","@timestamp":"2019-01-03T14:12:32Z","tags":["warning","elasticsearch","admin"],"pid":1451,"message":"Unable to revive connection: http://localhost:9200/"}
{"type":"log","@timestamp":"2019-01-03T14:12:32Z","tags":["warning","elasticsearch","admin"],"pid":1451,"message":"No living connections"}
{"type":"log","@timestamp":"2019-01-03T14:12:35Z","tags":["warning","elasticsearch","admin"],"pid":1451,"message":"Unable to revive connection: http://localhost:9200/"}
3.7 访问kibana
http://192.168.200.70:5601
四,使用nginx来限制访问kibana
4.1 使用nginx转发kibana
由于kibana没有权限控制,可以借助nginx来部署认证和进行ip控制
修改kibana的配置文件,改为监听127.0.0.1
vim /usr/local/kibana/config/kibana.yml
sed -n '7p' /usr/local/kibana/config/kibana.yml
杀掉kibana,重启动kibana
ps -ef | grep elk
kill -9 1451
ps -ef | grep elk
su -s /bin/bash elk '/usr/local/kibana/bin/start.sh'
ps -ef | grep elk | grep -v grep
4.2 借助nginx来限制访问,控制源IP的访问
编译安装nginx
yum -y install pcre-devel openssl-devel
tar xf nginx-1.10.2.tar.gz -C /usr/src/
cd /usr/src/nginx-1.10.2/
useradd -s /sbin/nologin -M nginx
./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
make && make install
ln -s /usr/local/nginx/sbin/* /usr/local/sbin/
nginx -V
编辑nginx配置文件,进行访问控制,并启动nginx
cd /usr/local/nginx/
cp conf/nginx.conf{,.bak}
egrep -v "#|^$" conf/nginx.conf.bak > conf/nginx.conf
vim conf/nginx.conf
cat conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request"'
'$status $body_bytes_sent "$http_referer"'
'"$http_user_agent""$http_x_forwarded_for"';
sendfile on;
keepalive_timeout 65;
server {
listen 5609;
access_log /usr/local/nginx/logs/kibana_access.log main;
error_log /usr/local/nginx/logs/kibana_error.log error;
location / {
allow 192.168.200.1;
deny all;
proxy_pass http://127.0.0.1:5601;
}
}
}
nginx -t
nginx
netstat -antup | grep nginx
4.3 访问nginx监听端口5609
http://192.168.200.70:5609
4.4 如果访问IP经常改变,授权就会很麻烦。可以利用nginx的访问验证功能来认证访问
location / {
auth_basic "elk auth";
auth_basic_user_file /usr/local/nginx/conf/htpasswd;
proxy_pass http://127.0.0.1:5601;
}
五,elasticsearch的安装和启动
elasticsearch未安装之前,kibana网页上报错,提示找不到elasticsearch。
5.1 elasticsearch的下载地址
elastic search主要用来存储数据,供kibana调取并进行展现
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.3.tar.gz
5.2 解压部署elasticsearch
ls
tar xf elasticsearch-6.2.3.tar.gz -C /usr/local/
mv /usr/local/elasticsearch-6.2.3 /usr/local/elasticsearch
5.3 elasticsearch配置
修改以下配置文件中的代码
cp /usr/local/elasticsearch/config/elasticsearch.yml{,.bak}
cat -n /usr/local/elasticsearch/config/elasticsearch.yml | sed -n '33p;37p;55p;59p'
33 #path.data: /path/to/data
37 #path.logs: /path/to/logs
55 #network.host: 192.168.0.1
59 #http.port: 9200
修改成如下配置文件中的代码
vim /usr/local/elasticsearch/config/elasticsearch.yml
cat -n /usr/local/elasticsearch/config/elasticsearch.yml | sed -n '33p;37p;55p;59p'
33 path.data: /usr/local/elasticsearch/data
37 path.logs: /usr/local/elasticsearch/logs
55 network.host: 127.0.0.1
59 http.port: 9200
5.4 把elasticsearch目录的用户和属主都更新为elk
chown -R elk:elk /usr/local/elasticsearch
5.5 更改jvm的内存限制(看个人配置,这里没做修改)
因为我们实验环境是虚拟机,1g内存一会儿就会被跑满,就会很慢。所以,我们要调整内存占用的限制。
cat -n /usr/local/elasticsearch/config/jvm.options | sed -n '22p;23p'
22 -Xms1g
23 -Xmx1g
vim /usr/local/elasticsearch/config/jvm.options --->这里没做修改
cat -n /usr/local/elasticsearch/config/jvm.options | sed -n '22p;23p'
22 -Xms100M
23 -Xmx100M
5.6 编辑elasticsearch启动脚本,使用-d进行后台启动。
vim /usr/local/elasticsearch/bin/start.sh
cat /usr/local/elasticsearch/bin/start.sh
/usr/local/elasticsearch/bin/elasticsearch -d >> /tmp/elasticsearch.log 2>> /tmp/elasticsearch.log
chmod a+x /usr/local/elasticsearch/bin/start.sh
5.7 启动elasticsearch
su -s /bin/bash elk '/usr/local/elasticsearch/bin/start.sh'
ps -ef | grep elk | grep -v grep
5.8 观察日志,看看kibana日志还会不会报elasticsearch错误
> /tmp/kibana.log
tail -f /tmp/kibana.log
重新刷新url:http://192.168.200.70:5609
观察日志,看看还有没有报错。
备注说明
假如elasticsearch如果监听在非127.0.0.1,那么需要修改内核参数等,在这里就不多说了。
六,logstash的安装和启动
6.1 logstash的下载地址
用来读取日志,正则分析日志,发送给elasticsearch数据库
https://artifacts.elastic.co/downloads/logstash/logstash-6.2.3.tar.gz
6.2 解压部署logstash
ls
tar xf logstash-6.2.3.tar.gz -C /usr/local/
mv /usr/local/logstash-6.2.3 /usr/local/logstash
6.3 更改logstash jvm配置,加入内存限制(看个人配置,这里没有修改)
修改如下配置
cat -n /usr/local/logstash/config/jvm.options | sed -n '6p;7p;'
6 -Xms1g
7 -Xmx1g
修改成如下配置(没做修改)
cat -n /usr/local/logstash/config/jvm.options | sed -n '6p;7p;'
6 -Xms150M
7 -Xmx150M
6.4 修改logstash配置文件
配置文件没有,需要新建
vim /usr/local/logstash/config/logstash.conf
cat /usr/local/logstash/config/logstash.conf
input {
file {
path => "/usr/local/nginx/logs/kibana_access.log" #读取日志路径
}
}
output {
elasticsearch {
hosts => ["http://127.0.0.1:9200"] #保存日志url
}
}
6.5 logstash的启动脚本
vim /usr/local/logstash/bin/start.sh
cat /usr/local/logstash/bin/start.sh
nohup /usr/local/logstash/bin/logstash -f /usr/local/logstash/config/logstash.conf >> /tmp/logstash.log 2>> /tmp/logstash.log &
chmod a+x /usr/local/logstash/bin/start.sh
6.6 启动logstash
logstash并没有监听端口,因此不需要用elk用户来启动
/usr/local/logstash/bin/start.sh
ps -ef | grep logstash
特别提示
logstash启动的比较慢,需要多等一会儿。
如果在kibana的Discover里能看到添加索引就说明logstash启动好了
6.7 在kibana上配置索引,展现获取的kibana日志数据
进行数据展现字段的筛选
对nginx的kibana_access.log进行数据追踪,对比分析
tail -f /usr/local/nginx/logs/kibana_access.log
七,logstash使用详解
执行下边的命令
ps -ef | grep logstash
kill -9 17120
/usr/local/logstash/bin/logstash -e ""
welcome --->输入的内容
{
"@version" => "1",
"@timestamp" => 2018-08-16T13:18:13.383Z,
"message" => "welcome",
"type" => "stdin",
"host" => "elkstack"
}
可以看到logstash结尾自动添加了几个字段,时间戳@timestamp,版本@version,输入的类型type,以及主机名host
7.1 logstash工作原理
Logstash使用管道方式进行日志的搜集处理和输出。有点类似于管道命令xxx|ccc|ddd,xxx执行完了会执行ccc,然后执行ddd。
在logstash中,包括了三个阶段:
输入input ---> 处理filter(不是必须的) ---> 输出output
每个阶段都有很多的插件配合工作,比如file,elasticsearch,redis等
每个阶段也可以指定多种方式,比如输出既可以输出到elasticsearch中,也可以指定到stdout在控制台打印。
由于这种插件式的组织方式,使得logstash变得易于扩展和定制
7.2 命令行中常用的命令
-f:通过这个命令可以指定Logstash的配置文件,根据配置文件配置logstash
-e:后面跟着字符串,该字符串可以被当作logstash的配置(如果是""则默认使用stdin作为默认输入,stdout作为默认输出)
-l:日志输出的地址(默认就是stdout直接在控制台中输出)
-t:测试配置文件是否正确,然后退出。
7.3 配置文件说明
前面介绍过logstash基本上由三部分组成,input,output以及用户需要才添加的filter,因此标准的配置文件格式如下:
input {...}
filter {...}
output {...}
在每个部分中,也可以指定多个访问方式,例如我想要指定两个日志来源文件,则可以这样写:
input {
file { path => "/var/log/messages" type => "syslog" }
file { path => "/var/log/apache/access.log" type => "apache" }
}
类似的,如果在filter中添加了多种处理规则,则按照它的顺序----处理,但是有一些插件并不是线程安全的。
比如在filter中指定了两个一样的插件,这两个任务并不能保证准确的按顺序执行,因此官方也推荐避免在filter中重复使用插件。
八,利用logstash的正则进行日志信息的抓取测试
我们更改一下logstash的配置文件进行正则抓取数据的测试。
logstash提取数据段配置文件模板详解
cd /usr/local/logstash/config/
vim logstash.conf
cat logstash.conf
input {
stdin{} #从标准输入读取数据
}
filter {
grok {
match => {
"message" => '(?<字段名>正则表达式).*'
}
}
}
output {
elasticsearch { #如果要输入到elasticsearch里,那么需要注释掉stdout{}
hosts => ["http://127.0.0.1:9200"]
}
stdout { #只将信息输出到屏幕上
codec => rubydebug #用于正则提取测试,将正则抓取结果输出到屏幕上
}
}
杀掉后台的logstash进程
ps -ef | grep logstash --->查询PID号
kill -9 PID号
为了测试方便,我们暂时交互式启动logstash
/usr/local/logstash/bin/logstash -f /usr/local/logstash/config/logstash.conf
8.1 测试性抓取日志字段
用于进行测试输入的日志内容
Aug 16 18:29:49 ELK systemd: Startup finished in 789ms (kernel) + 1.465s (initrd) + 18.959s (userspace) = 21.214s.
修改logstash配置文件
vim /usr/local/logstash/config/logstash.conf
cat /usr/local/logstash/config/logstash.conf
input {
stdin{}
}
filter {
grok {
match => {
"message" => '(?
[a-zA-Z]+ [0-9]+ [0-9:]+) (? [a-zA-Z]+).*' }
}
}
output {
elasticsearch {
hosts => ["http://127.0.0.1:9200"]
}
stdout {
codec => rubydebug
}
}
交互式启动logstash
/usr/local/logstash/bin/logstash -f /usr/local/logstash/config/logstash.conf
输出结果如下
Aug 16 18:29:49 ELK systemd: Startup finished in 789ms (kernel) + 1.465s (initrd) + 18.959s (userspace) = 21.214s.
{
"hostname" => "ELK", #这就是抓取的字段
"mydate" => "Aug 16 18:29:49", #这就是抓取的字段
"@timestamp" => 2018-08-16T12:47:46.904Z,
"message" => "Aug 16 18:29:49 ELK systemd: Startup finished in 789ms (kernel) + 1.465s (initrd) + 18.959s (userspace) = 21.214s.",
"host" => "elkstack",
"@version" => "1"
}
请通过配置文件进行反复测试验证,熟悉logstash正则表达的使用方法
8.2 将抓取的字段信息输入到elasticsearch并显示在kibana上
logstash配置文件如下
vim /usr/local/logstash/config/logstash.conf
cat /usr/local/logstash/config/logstash.conf
input {
stdin{}
}
filter {
grok {
match => {
"message" => '(?
[a-zA-Z]+ [0-9]+ [0-9:]+) (? [a-zA-Z]+).*' }
}
}
output {
elasticsearch {
hosts => ["http://127.0.0.1:9200"]
}
# stdout {
# codec => rubydebug
# }
}
用于进行测试输入的日志内容
/usr/local/logstash/bin/logstash -f /usr/local/logstash/config/logstash.conf
Aug 16 18:29:49 ELK systemd: Startup finished in 789ms (kernel) + 1.465s (initrd) + 18.959s (userspace) = 21.214s.
九,elk技术全量分析nginx日志
logstash如果直接把一整行日志直接发送给elasticsearch,kibana显示出来就没有什么意义,我们需要提取自己想要的字段。假如说我们想要提取响应码,用户访问url,响应时间等,就得依靠正则来提取。
logstash提取数据段配置文件模板详解
input { #日志输入来源函数
file {
path => "/usr/local/nginx/logs/kibana_access.log"
}
}
filter { #字段数据提取函数
grok {
match => {
"message" => '(?<字段名>正则表达式).*'
}
}
}
output { #数据输出目的地函数
elasticsearch {
hosts => ["http://127.0.0.1:9200"]
}
}
9.1 利用正则从message中提取kibana访问日志的IP地址
vim /usr/local/logstash/config/logstash.conf
cat /usr/local/logstash/config/logstash.conf
input {
file {
path => "/usr/local/nginx/logs/kibana_access.log"
}
}
filter {
grok {
match => {
"message" => '(?
[0-9.]+) .*' }
}
}
output {
elasticsearch {
hosts => ["http://127.0.0.1:9200"]
}
}
交互式启动logstash
/usr/local/logstash/bin/logstash -f /usr/local/logstash/config/logstash.conf
检查测试结果
9.2 从message中提取kibana访问日志的time,url,返回码,字节大小
vim /usr/local/logstash/config/logstash.conf
cat /usr/local/logstash/config/logstash.conf
input {
file {
path => "/usr/local/nginx/logs/kibana_access.log"
}
}
filter {
grok {
match => {
"message" => '(?
[0-9.]+) .*HTTP/[0-9.]+"(?[0-9]+) (? [0-9]+)[ "]+(? [a-zA-Z]+://[0-9.]+:[0-9]+/[a-zA-Z/]+)".*' }
}
}
output {
elasticsearch {
hosts => ["http://127.0.0.1:9200"]
}
}
交互式启动logstash
/usr/local/logstash/bin/logstash -f /usr/local/logstash/config/logstash.conf