ELK日志系统浅析与部署

1、ELK应用场景
在复杂的企业应用服务群中,记录日志方式多种多样,而且不易归档以及提供日志监控的机制。不管是开发人员仍是运维人员都没法准确的定位服务、服务器上面出现的种种问题,也没有高效搜索日志内容从而快速定位问题的方式。所以须要一个集中式、独立的、搜集管理各个服务和服务器上的日志信息,集中管理,并提供良好的UI界面进行数据展现,处理分析。java

得此:ELK提供一套开源的解决方案,能高效、简便的知足以上场景。linux

2、ELK日志系统介绍
一、ELK分别是Elasticsearch、Logstash、Kibana三个开源框架缩写。web

框架    简介    做用
Elasticsearch    开源分布式搜索引擎,提供存储、分析、搜索功能。特色:分布式、基于reasful风格、支持海量高并发的准实时搜索场景、稳定、可靠、快速、使用方便等。    接收搜集的海量结构化日志数据,并提供给kibana查询分析
Logstash    开源日志搜集、分析、过滤框架,支持多种数据输入输出方式。    用于收集日志,对日志进行过滤造成结构化数据,并转发到elasticsearch中
Kibana    开源日志报表系统,对elasticsearch以及logstash有良好的web页面支持。    对elasticsearch提供的数据进行分析展现redis

二、ELK经典应用以下spring

ELK经典架构sql

如图json

Logstash部署至服务主机,对各个服务的日志进行采集、过滤、推送。
Elasticsearch存储Logstash传送的结构化数据,提供给Kibana。
Kibana提供用户UIweb页面进行,数据展现和分析造成图表等。
备注:logs 泛指,各类日志文件以及日志信息:windows,negix,tomcat,webserver等等。windows

三、ELK改进centos

因为Logstash消耗资源大,而服务器资源至关宝贵,因此引进另外一个轻量级日志采集框架Beats,其中包含如下6种缓存

Packetbeat    用于搜集网络流量数据
Heartbeat

用于运行时间监控
Filebeat    用于搜集文件数据
Winlogbeat    用于搜集winodws事件数据
Metricbeat    用于指标
Auditbeat    用于审计数据

改良ELK
四、进一步思考

传统web项目中,常用log4j以及logback(性能更高)等成熟日志插件进行日志的记录,是否提供更好的解决方案。

ELK升级1.0

如图

日志采集新增Logback直接发送日志到Logstash的形式。若是采用此方式,web服务可减小部分生成log文件配置,提升实时性和日志推送效率
五、高并发场景

因为logstash消耗性能,因此高并发场景容易遇到流量上的瓶颈,及时使用logstash集群也是如此,因此能够添加中间件进行日志缓存处理。因为logstash数据源具备多种方式,全部中间件也能够不少选择,常见的有kafka,redis。

ELK升级2.0

如图

host一、中间件、host2 均为高可用服务集群   为简单显示未画出
logback出现的业务数据能够经过写入redis或者kafka等中间件进行缓存,再经过合理限制流量阀值输送至logstash进行过滤
beats 若是是filebeat其日志若无实时性要求,能够经过控制log文件更新速度限制Beats传输日志流量

三 ELK搭建(非集群)
一、下载ELK(保持版本一致)!

Elasticsearch    官网elasticsearch-6.3.0.tar    elasticsearch官方文档
Kibana    官网kibana-6.3.0下载 linux64位    kibana官方文档
Logstash    官网logstash-6.3.0.tar    logstash官方文档
Filebeat    官网filebeat-6.3.0 linux64位    beats官方文档
备注:演示为centos7 即linux版本,请按实际需求更改

经过rz命令上传至centos7虚拟机


二、解压

tar -zxvf elasticsearch-6.3.0.tar.gz          
tar -zxvf kibana-6.3.0-linux-x86_64.tar.gz
tar -zxvf filebeat-6.3.0-linux-x86_64.tar.gz  
tar -zxvf logstash-6.3.0.tar.gz
备注:tar不支持指定解压目标目录 能够经过mv 命令进行迁移。本教程迁移至/home目录下
三、java环境搭建

推荐使用jdk1.8jdk环境配置

四、安装elasticsearch

修改配置文件

vi /home/elasticsearch-6.3.0/config/elasticsearch.yml
# ---------------------------------- Network -----------------------------------
#
# Set the bind address to a specific IP (IPv4 or IPv6):
#
network.host: 0.0.0.0           ##服务器ip 本机
#
# Set a custom port for HTTP:
#
http.port: 9200                 ##服务端口
#
# For more information, consult the network module documentation.
#
启动elasticsearch

/home/elasticsearch-6.3.0/bin/elasticsearch   #命令窗运行
/home/elasticsearch-6.3.0/bin/elasticsearch  -d  #后台线程运行
关闭elasticsearch

ctrl+c                                   #命令窗关闭
ps -ef | grep elastic                    #后台线程关闭
kill -9 4442                             ##pid 4442为查处线程的pid 


常见问题解决elasticsearch启动常见问题

验证elasticsearch启动

五、安装kibana

修改配置文件

vi /home/kibana-6.3.0-linux-x86_64/config/kibana.yml
server.port: 5601       ##服务端口
server.host: "0.0.0.0"  ##服务器ip  本机

elasticsearch.url: "http://localhost:9200" ##elasticsearch服务地址 与elasticsearch对应
启动kibana
/home/kibana-6.3.0-linux-x86_64/bin/kibana       #命令窗启动
nohup ./kibana-6.3.0-linux-x86_64/bin/kibana &   #后台线程启动
关闭kibana

ctrl+c                                   #命令窗关闭
ps -ef | grep kibana                    #后台线程关闭
kill -9 4525                             ##pid 4525 为查处线程的pid 


备注:常见问题多为 端口占用,以及目录未受权,须要同elasticsearch 使用目录运行执行的用户去执行 未配置则为root用户
验证kibana启动

六、安装logstash

新建配置文件

vi /home/logstash-6.3.0/config/logback-es.conf
input {
    tcp {  
        port => 9601  
        codec => json_lines         
    }
}
output {
        elasticsearch {
                hosts => "localhost:9200"
        }
        stdout { codec => rubydebug}
}
备注:上述文件复制时必须去除多余空格,保持yml文件规范。

备注:上图与配置部分一一对应
input {                                ##input 输入源配置
    tcp {                              ##使用tcp输入源      官网有详细文档
        port => 9601                   ##服务器监听端口9061 接受日志  默认ip localhost
        codec => json_lines            ##使用json解析日志    须要安装json解析插件
    }

filter {                              ##数据处理
}                                
output {                               ##output 数据输出配置
        elasticsearch {                ##使用elasticsearch接收
            hosts => "localhost:9200"  ##集群地址  多个用,隔开
        }
        stdout { codec => rubydebug}   ##输出到命令窗口
}
logstash官方输入源支持以及下载

安装logstash json插件

/home/logstash-6.3.0/bin/logstash-plugin install logstash-codec-json_lines
启动logstash

 /home/logstash-6.3.0/bin/logstash -f /home/logstash-6.3.0/config/logback-es.conf         ##命令窗形式
nohup /home/logstash-6.3.0/bin/logstash -f /home/logstash-6.3.0/config/logback-es.conf &  ##后台线程形式


关闭logstash

ctrl+c                                   #命令窗关闭
ps -ef | grep logstash                    #后台线程关闭
kill -9 4617                              ##pid 4617 为查处线程的pid 

7 使用logback 传输日志到logstash

创建springboot项目(为了快速使用)

pom文件依赖

               <dependency>
            <groupId>net.logstash.logback</groupId>
            <artifactId>logstash-logback-encoder</artifactId>
            <version>4.11</version>
        </dependency>
logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration>
    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>192.168.253.6:9601</destination>     <!--指定logstash ip:监听端口 tcpAppender  可本身实现如kafka传输等-->
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />
    </appender>

    <include resource="org/springframework/boot/logging/logback/base.xml"/>      <!--引用springboot默认配置-->

    <root level="INFO">
        <appender-ref ref="LOGSTASH" />                                           <!--使用上述订阅logstash数据tcp传输 -->
        <appender-ref ref="CONSOLE" />                                            <!--使用springboot默认配置 调试窗口输出-->
    </root>

</configuration>
SpringbootLogbackApplication.java 测试
package com.zyj;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringbootLogbackApplication {
    private final static Logger logger = LoggerFactory.getLogger(SpringbootLogbackApplication.class);

    public static void main(String[] args) {
        new Thread(()->{
            for (int i=0;i<100;i++){
                logger.info("---test---"+i);
            }
        }).start();

        SpringApplication.run(SpringbootLogbackApplication.class, args);
    }
}
9 验证ELK

为演示方便,咱们简单展现一下,单位时间线程打印某日志的速度。主要经过kibana过滤出结构化数据,经过以数据的时间戳为x轴,以count统计函数为y轴进行图表展现。

(1)后台启动elasticsearch  kibana logstash 并验证启动成功

(2)启动springboot项目

(3)logstash输出控制台记录  此为默认无过滤器打印logback包装的所有信息

(4)kibana日志显示

添加elasticsearch日志数据

使用时间戳显示 单位时间线程记录日志数量

四 、思考拓展
一、本文未详细介绍logback详细配置,以及自定义日志传输,将后续写入kafka以及redis方案,log4j亦可使用elk因性能问题不作深究。

二、本文未详细介绍elasticsearch,logstash,kibana,beats的详细使用,仅罗列架构以及初步elk使用。beats经常使用为filebeat,对已经生成文档的日志进行传输。

三、没有完美的架构,只有合适的用法,针对不一样的业务环境须要对架构进行微调,总体思路不变。elk为单独高可用服务群,服务器群与beats或者logback亦是独立高可用。

四、根据业务须要,在logback打印的日志中能够进行结构化处理,亦或者在logstash的filter中对数据进行结构化处理。业务场景有待考究,初步考虑异常分析以及sql回滚等。 ---------------------  做者:Mars_Bug  来源:CSDN  原文:https://blog.csdn.net/qq_22211217/article/details/80764568  版权声明:本文为博主原创文章,转载请附上博文连接!

相关文章
相关标签/搜索