• 用ELK搭建简单的日志收集分析系统【转】


    缘起

    在微服务开发过程中,一般都会利用多台服务器做分布式部署,如何能够把分散在各个服务器中的日志归集起来做分析处理,是一个微服务服务需要考虑的一个因素。

    搭建一个日志系统

    搭建一个日志系统需要考虑一下一些因素:

    1. 利用什么技术,是自己实现还利用现成的组件
    2. 日志需要定义统一的格式
    3. 日志需要拥有一个锚点来进行全局跟踪

    第一个问题,针对我们小公司来说,基本没有自己的研发能力,绝对是选用第三方开源的组件了。ELK配置比较简单,有现成的UI界面,容易检索日志信息,是首选。 
    第二个问题,利用log4j2定义好统一的日志格式,利用logstash过滤日志内容。 
    第三个问题,全局跟踪的ID有几种生产方式,一种是利用UUID或者生成随机数,一种是利用数据库来生成sequence number,还可以通过自定义一个id生成服务来获取。考虑到自身服务的需要,这里选用生成随机数来实现。

    日志系统架构

    ELK简单架构

    从左边看起,每一台webserver上都会部署一个logstash-agent,它的作用是用类似tailf的方式监听日志文件,然后把新添加的日志发送到redis队列里面,logstash-indexer负责从redis相应的队列里面取出日志,对日志进进行加工后输出到elasticsearch中,elasticsearch会根据要求对日志进行索引归集,最后用户可以通过kibana来查看和分析日志。

    开始搭建日志系统

    准备工作

    1. 安装JDK8
    2. 安装Redis2.8

    这里不涉及怎样安装JDK和Redis,请自行查阅资料

    使用logstash2.3.1elasticsearch2.3.1kibana2.3.1

    首先去ELK官网下载相应的压缩包 
    https://www.elastic.co/downloads

    在webserver上安装logstash-agent

    1.解压 tar -zxvf logstash2.3.1 
    2.检验安装是否成功 bin/logstash -e "input{stdin{}}output{stdout{}}",然后在终端输入hello,看看有没有内容返回 
    安装logstash 
    3.编写配置文件logstash_agent.conf 
    在logstash安装目录下新建conf文件夹,在里面新建配置文件logstash_agent.conf

    input {
            file {
                    type => "customer_service"
                    #需要收集的日志文件
                    path => ["/home/java/logs/cust/customer-service-*.log"] 
                    tags => ["customer-service", "log4j2"]
                    #              
                    codec => multiline { #
                            pattern => "^%{TIMESTAMP_ISO8601}"
                            negate => true
                            what => "previous"
                    }
            }
    }
    output {
            redis {
                    host => "192.168.235.195"
                    data_type => "list"
                    key => "logstash:redis:customer"
            }
    }

    4.后台启动 
    nohup ./bin/logstash -f conf/logstash_agent.conf &

    在日志server上安装elasticsearch

    1.解压tar -zxvf elasticsearch-2.3.1.tar.gz 
    2.修改安装目录下的配置文件config/elasticsearch.yml 
    把network.host字段给反注释掉,把地址改为0.0.0.0(官方并没明确说要去改这配置,默认配置应该就可以了,不过实测的时候发现如果不做这修改,elasticsearch访问不了) 
    这里写图片描述 
    3.后台启动elasticsearch 
    nohup ./bin/elasticsearch &

    在日志server上安装logstash-indexer

    在webserver上安装logstash-agent一节基本相同,只是配置文件不一样,这里使用logstash-indexer.conf

    input {
            redis {
                    host => "localhost" #redis地址
                    data_type => "list"
                    key => "logstash:redis:customer"
                    type => "redis-input"
            }
    }
    filter {
        grok {
            match => {
                "message" => "%{TIMESTAMP_ISO8601:date} [(?<thread_name>.+?)] (?<log_level>w+)s*(?<content>.*)"
            }
        }
        date {
            match => ["timestamp", "dd/MMM/YYYY:HH:mm:ss Z"]
        }
    }
    output {
            if[type] == "customer_service" {
                elasticsearch {
                        #embedded => false
                        #protocol => "http"
                        hosts => "localhost:9200"
                        index => "customer-%{+YYYY.MM.dd}"
                }
            }else if[type] == "其他类型" {
                elasticsearch {
                        #embedded => false
                        #protocol => "http"
                        hosts => "localhost:9200"
                        index => "其他类型索引名字-%{+YYYY.MM.dd}"
                }
            }else {
                //做其他处理
            }
            stdout{ #输出到标准输出,可以去掉
            }
    }

    启动logstash-indexer 
    nohup ./bin/logstash -f conf/logstash-indexer.conf &

    在日志server上安装kibana

    1.解压tar -zxvf kibana-4.5.0-linux-x64.gz 
    2.后台启动kibana nohup ./bin/kibana & 
    这里没有特别去配置kibana要访问的elasticsearch地址,默认它会找本地的,如果需要,可以到conf/kibana.yml修改

    配置log4j2的日志格式

    <PatternLayout pattern="%d{ISO8601} %t %level %msg%n"/>

    访问kibana主页

    1.打开kibana主页http://your-kibana-ip:5601/ 
    2.输入索引customer-*,并点击create 
    这里写图片描述 
    3.在Discover页面观察日志 
    这里写图片描述

    ToDo:

    需要了解elasticsearch日志存放在哪里,定期清理日志

    清理Elasticsearch索引

    索引放久了需要清理,清理所以可以使用Elasticsearch的API。 
    例如我需要删除某个索引2016年5月份的所有索引,可以使用下面的命令:

    curl -XDELETE 'http://localhost:9200/customer-2016.05.*'

    更多API可以查阅Elastic官网 
    https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete.html

    参考资料

    http://www.cnblogs.com/yjf512/p/4199105.html 

    http://www.cnblogs.com/xing901022/p/4805586.html 
    https://github.com/chenryn/logstash-best-practice-cn/blob/master/codec/multiline.md 
    http://www.open-open.com/lib/view/open1451801542042.html

    转自

    用ELK搭建简单的日志收集分析系统
    http://m.blog.csdn.net/lzw_2006/article/details/51280058

  • 相关阅读:
    JAVA假期第五天2020年7月10日
    JAVA假期第四天2020年7月9日
    JAVA假期第三天2020年7月8日
    JAVA假期第二天2020年7月7日
    JAVA假期第一天2020年7月6日
    CTF-sql-group by报错注入
    CTF-sql-order by盲注
    CTF-sql-sql约束注入
    CTF-sql-万能密码
    X-Forwarded-for漏洞解析
  • 原文地址:https://www.cnblogs.com/paul8339/p/7065706.html
Copyright © 2020-2023  润新知