使用docker-compose 快速搭建elk

  • 前置条件 安装好docker 和docker-compose 
  • 首先将 https://github.com/deviantony/docker-elk 克隆到本地 
  • 打开文件目录 docker-elk\kibana\config\kibana.yml 文件 修改登录账号密码
    ---
    ## Default Kibana configuration from Kibana base image.
    ## https://github.com/elastic/kibana/blob/master/src/dev/build/tasks/os_packages/docker_generator/templates/kibana_yml.template.ts
    #
    server.name: kibana
    server.host: 0.0.0.0
    elasticsearch.hosts: [ "http://elasticsearch:9200" ]
    monitoring.ui.container.elasticsearch.enabled: true
    
    ## X-Pack security credentials
    #修改登录账号密码
    elasticsearch.username: elastic
    elasticsearch.password: changeme
    ## 将Kinbana 界面设置成中文 如果习惯英文可以删除此配置默认是英文配置
    i18n.locale: "zh-CN"

     

  • 打开docker-compose.yml 文件修改es密码
  •  转到clone 跟目录执行 

    docker-compose up

     虽然官方貌似已经默认推荐使用filebeat 进行日志收集 ,奈何这个教程实在无脑先上之后再研究看看filebeat 。还有就是logstash filter 做日志过滤很方便,貌似filebeat 还不支持。所以先玩一下elk

  • 一些其他问题  elk 写入日志时 时间查询总是对不上结果发现是本地发送日志机器和服务器的时间差七分钟。  所以入es 的时间是服务器时间。kinbana的时区又默认是浏览器的时间也就是我本机。所以日志没有实时而是有七分钟的差距。image.png
    #liunx校准时间
    yum install -y ntp
    
    ntpdate cn.pool.ntp.org

     

  • 使用logstash 过滤字段脚本(把 key=value#key2=value2 变成多字段)
    //Nlog 配置如下    
    <target xsi:type="Network" name="ownLog-tcp" keepConnection="false" address ="tcp://192.168.3.10:5000" layout="node=${nodeName}#time=${longdate}#env=${aspnet-environment}#host=${aspnet-request-host}#url=${aspnet-request-url}#method=${aspnet-request-method}#level=${uppercase:${level}}#caller=${callsite}#linenumber=${callsite-linenumber}#msg=${message}#exception=${exception:format=ToString}#requestId=${requestId}#userflag=${userflag}#platformId=${platformId}#duration=${aspnet-request-duration}" />
    解析配置的logstash 过滤器
    
    input {
        beats {
            port => 5044
        }
    
        tcp {
            port => 5000
        }
    }
    
    ## Add your filters / logstash plugins configuration here
    
    filter {
        ruby {
            code => "
                array1 = event.get('message').split('#')
                array1.each do |temp1|
                    if temp1.nil? then
                        next
                    end
                    array2 = temp1.split('=')
                    key = array2[0]
                    value = array2[1]
                    if key.nil? then
                        next
                    end
                    event.set(key, value)
                end
            "
            remove_field => [ "message" ]
        }
    }
    
    output {
        elasticsearch {
            hosts => "elasticsearch:9200"
            user => "elastic"
            password => "changeme"
            ecs_compatibility => disabled
        }
    }

     

  •  这样就把message拆分成多个查询字段

     

    image.pngimage.png

  • kinbana 一次显示两条日志 _id 不同 。  检查pipline 文件夹下是否有多个logstash 备份文件
  • es 记录多条日志 : message 记录日志的时候每一个回车换行都会当成一个新的指令执行到es里面  这里需要用到logstash 的multiline 插件 
    •  首先进入到容器中更换Gem 源地址  然后安装multiline 插件 
      #首先把第一行source 换成中国节点的地址https://gems.ruby-china.com/
      vi /opt/logstash/Gemfile 
      #安装multiline插件
      logstash-plugin install logstash-filter-multiline
      logstash-plugin install logstash-codec-multiline

       

    •  更改pipline 文件夹目录下conf文件 ( /opt/logstash/pipeline/logstash.conf)

      在filter 节点下添加
      multiline {
              pattern => "^#" //匹配正则为#开头的
              negate => true
              what => "previous"
              }

       

posted @ 2020-12-07 17:13  雨V幕  阅读(3293)  评论(0编辑  收藏  举报