绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
ELK日志分析系统
2020-06-03 13:40:05

一般我们需要进行日志分析场景,往往应运营需要, 对应用进行日志分析, 为运营推广提供有用的运营数据,使运营推广具有目的性、针对性和直接性,我不是运营出身,所以我也不知道怎么去概括这个事情,说白了,就是运营想知道,用户行为是什么样的,用户更关心的是什么等等一系列问题;那我们如何做到呢?通常我们的做法是直接对日志文件进行grep、awk等命令就可以获得想要的信息。但是,随着用户体量的增加,支撑的节点也随之增加,那么传统方法暴露出很多问题,比如:效率低下,日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询等等。这就需要我们集中化处理我们的日志,那么如何对所有服务器上的日志进行收集汇总?常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。

一个完整的集中式日志系统,需要包含以下几个主要特点:

收集-能够采集多种来源的日志数据

传输-能够稳定的把日志数据传输到中央系统

存储-如何存储日志数据

分析-可以支持 UI 分析

警告-能够提供错误报告,监控机制


ELK提供了一整套解决方案,并且都是开源软件,之间互相配合使用,完美衔接,高效的满足了很多场合的应用。目前主流的一种日志系统。

ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具。

Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。

Logstash 主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。

Kibana 也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。

这是常见的ELK的结构图

带有beats的结构图

关于安装,这里就不讲了,二进制包,解压就可用;下面我们看一下,用logstash收集系统secure日志和nginx日志,首先我们来看一下secure的logstash收集配置文件:

input {
    file {
        type => "system"
        path => [ "/var/log/secure" ]
        start_position => "beginning"
    }
}

filter {
    grok {
        add_tag => [ "valid" ]
        match => [
        "message", "%{SYSLOGTIMESTAMP:syslog_date} %{SYSLOGHOST:syslog_host}%{DATA:syslog_program}(?:\[%{POSINT}\])?: %{WORD:login} password for %{USERNAME:username} from %{IP:ip} %{GREEDYDATA}",
        "message", "%{SYSLOGTIMESTAMP:syslog_date} %{SYSLOGHOST:syslog_host}%{DATA:syslog_program}(?:\[%{POSINT}\])?: message repeated 2 times: \[ %{WORD:login} password for %{USERNAME:username} from %{IP:ip} %{GREEDYDATA}",
        "message", "%{SYSLOGTIMESTAMP:syslog_date} %{SYSLOGHOST:syslog_host}%{DATA:syslog_program}(?:\[%{POSINT}\])?: %{WORD:login} password for invalid user %{USERNAME:username} from %{IP:ip} %{GREEDYDATA}",
        "message", "%{SYSLOGTIMESTAMP:syslog_date} %{SYSLOGHOST:syslog_host}%{DATA:syslog_program}(?:\[%{POSINT}\])?: %{WORD:login} %{WORD:auth_method} for %{USERNAME:username} from %{IP:ip} %{GREEDYDATA}"
        ]
    }

    if "valid" not in [tags] {
        drop { }
    }

    mutate {
        remove_tag => [ "valid" ]
        lowercase => [ "login" ]
    }


    date {
        match => [ "syslog_date", "MMM d HH:mm:ss", "MMM dd HH:mm:ss", "ISO8601" ]
        timezone => "Asia/Shanghai"
    }

    geoip {
        source => "ip"
        fields => ["city_name"]
        database => "/usr/local/lnmp/logstash/GeoLite2-City.mmdb"
    }
}


output {
    # stdout { codec => rubydebug }
    elasticsearch {
        hosts => [ "10.9.117.83:9200", "10.9.165.245:9200", "10.9.13.93:9200" ]
        index => "logstash-ssh-login-%{+YYYY.MM.dd}"
    }
}

supervisor管理如下:

[program:ssh]
stdout_logfile=/data/logs/supervisor/ssh_stdout.log
redirect_stderr=true
environment=JAVA_HOME="/usr/local/lnmp/jdk1.8.0_151"
command=/usr/local/lnmp/logstash/bin/logstash -f /usr/local/lnmp/logstash/config/ssh-login.conf --path.data /usr/local/lnmp/logstash/ssh_data
user=root
autostart=true
autorestart=true
startsecs=3

查看运行实例:

# supervisorctl status
nginx                            RUNNING   pid 5489, uptime 22:37:49
ssh                              RUNNING   pid 5490, uptime 22:37:49

kibana配置:

host ssh-login status

nginx 配置如下:

input {
    file {
        type => "nginx_log"
        path => ["/data/logs/wwwlogs/www.log", "/data/logs/wwwlogs/test.log"]
    }
}

filter {
    mutate {
        replace => { "type" => "nginx_access" }
        replace => { "host" => "10-19-72-229" }
    }
    grok {
        match => { "message" => "%{NGINXACCESS}" }
        overwrite => [ "message" ]
    }

    date {
        match => [ "timestamp", "dd/MMM/YYYY:HH:mm:ss Z"]
    }

    geoip {
        source => "clientip"
        target => "geoip"
        database => "/usr/local/lnmp/logstash/GeoLite2-City.mmdb"
        add_tag => [ "nginx-geoip" ]
        add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
        add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ]
    }
}

output {
    elasticsearch {
        hosts => [ "10.9.117.83:9200", "10.9.165.245:9200", "10.9.13.93:9200" ]
        index => "logstash-nginx-access-%{+YYYY.MM.dd}"
    }
    # stdout { codec => rubydebug }
}

在logstash根下面创建一个patterns目录并创建nginx文件,内容如下:

NGUSERNAME [a-zA-Z\.\@\-\+_%]+
NGUSER %{NGUSERNAME}
NGINXACCESS %{IPORHOST:clientip} - %{NOTSPACE:remote_user} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:agent} %{NOTSPACE:http_x_forwarded_for}

supervisor管理:

[program:nginx]
stdout_logfile=/data/logs/supervisor/nginx_stdout.log
redirect_stderr=true
environment=JAVA_HOME="/usr/local/lnmp/jdk1.8.0_151"
command=/usr/local/lnmp/logstash/bin/logstash -f /usr/local/lnmp/logstash/config/nginx.conf --path.data /usr/local/lnmp/logstash/nginx_data
user=root
autostart=true
autorestart=true
startsecs=3

kibana配置如下:

request clientip top 5

ELK近的几个版本又推出了beats集, 并推荐使用它们!

分享好友

分享这个小栈给你的朋友们,一起进步吧。

Elasticsearch
创建时间:2020-05-22 14:49:51
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。我们建立一个网站或应用程序,并要添加搜索功能,但是想要完成搜索工作的创建是非常困难的。我们希望搜索解决方案要运行速度快,我们希望能有一个零配置和一个完全免费的搜索模式,我们希望能够简单地使用JSON通过HTTP来索引数据,我们希望我们的搜索服务器始终可用,我们希望能够从一台开始并扩展到数百台,我们要实时搜索,我们要简单的多租户,我们希望建立一个云的解决方案。因此我们利用Elasticsearch来解决所有这些问题及可能出现的更多其它问题。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • 栈栈
    专家
戳我,来吐槽~