大数据环境ELK环境实操-logstash的安装、配置、测试

2019-02-17 19:25
3426
3

1、简介

E与K已经被安装啦,所以本文档只讲述在大数据环境中logstash的安装、测试、以及针对大数据java日志的配置。

2、实操日志:

  1. 因为大数据是jdk1.7的环境,而目前新版的logstash 5+以上的版本要求的环境是jdk1.8。故而需要安装jdk1.8,并且还要修改logstash的启动环境参数

    cd /opt
    #下载并解压java安装包
    wget http://10.104.7.176:8000/jdk-8u111-linux-x64.tar.gz #内网环境
    tar -xzvf jdk-8u111-linux-x64.tar.gz
    ​
    #下载并解压logstash 安装包
    wget https://artifacts.elastic.co/downloads/logstash/logstash-6.3.2.tar.gz
    tar -xzvf logstash-6.3.2.tar.gz
    ​
    #修改logstash启动环境参数 (在多jdk的环境中这一步非常重要)
    vi bin/logstash.lib.sh
    export JAVA_HOME="/opt/jdk1.8.0_111"
    #wq 保存
    ​
  2. 测试logstash与 multiline codec插件

    #查看 logstash 当前的所有插件
    bin/logstash-plugin list
    #此指令能成功运行,说明环境参数有效,第一步操作成功。
    #查看插件的相关指令详情请查阅官方文档:#https://www.elastic.co/guide/en/logstash/current/working-with-plugins.html
    # 得知已经存在 logstash-codec-multiline 的插件
    # 测试logstash
    bin/logstash -e 'input { stdin {codec => multiline { pattern => "^%{TIMESTAMP_ISO8601}" negate => true  what => "previous" } }} output { stdout {codec => rubydebug}}'
    # 相关codec multiline的配置详情 请查阅:#https://www.elastic.co/guide/en/logstash/current/plugins-codecs-multiline.html
    ​
    #下面是启动后的日志若显示【The stdin plugin is now waiting for input:】表示可以在显示控制台输入测试文本。
    #请复制一下文本进行测试:
    2018-10-16 22:56:58.673 [AMQP Connection 121.40.177.246:5672] ERROR c.r.c.impl.ForgivingExceptionHandler -An unexpected connection driver error occured
    java.net.SocketException: Operation timed out (Read failed)
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
        at java.net.SocketInputStream.read(SocketInputStream.java:171)
        at java.net.SocketInputStream.read(SocketInputStream.java:141)
        at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
        at java.io.BufferedInputStream.read(BufferedInputStream.java:265)
        at java.io.DataInputStream.readUnsignedByte(DataInputStream.java:288)
        at com.rabbitmq.client.impl.Frame.readFrom(Frame.java:91)
        at com.rabbitmq.client.impl.SocketFrameHandler.readFrame(SocketFrameHandler.java:164)
        at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:571)
        at java.lang.Thread.run(Thread.java:748)
    ​
    #若控制台输出以下结果,表示测试成功:
    {
              "host" => "hdp03",
          "@version" => "1",
        "@timestamp" => 2018-12-11T03:30:40.748Z,
              "tags" => [
            [0] "multiline"
        ],
           "message" => "2018-10-16 22:56:58.673 [AMQP Connection 121.40.177.246:5672] ERROR c.r.c.impl.ForgivingExceptionHandler -An unexpected connection driver error occured\njava.net.SocketException: Operation timed out (Read failed)\n\tat java.net.SocketInputStream.socketRead0(Native Method)\n\tat java.net.SocketInputStream.socketRead(SocketInputStream.java:116)\n\tat java.net.SocketInputStream.read(SocketInputStream.java:171)\n\tat java.net.SocketInputStream.read(SocketInputStream.java:141)\n\tat java.io.BufferedInputStream.fill(BufferedInputStream.java:246)\n\tat java.io.BufferedInputStream.read(BufferedInputStream.java:265)\n\tat java.io.DataInputStream.readUnsignedByte(DataInputStream.java:288)\n\tat com.rabbitmq.client.impl.Frame.readFrom(Frame.java:91)\n\tat com.rabbitmq.client.impl.SocketFrameHandler.readFrame(SocketFrameHandler.java:164)\n\tat com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:571)\n\tat java.lang.Thread.run(Thread.java:748)"
    }   
    ​
  3. 开始配置logstash-hdp.conf

input {
  file {
    path => "/opt/log/flume-ng"
    codec => multiline {
      # Grok pattern names are valid!
      pattern => "^%{TIMESTAMP_ISO8601}"
      negate => true
      what => "previous"
    }
  }
}
​
filter {
  grok {
    match => { match => { "message" => "%{TIMESTAMP_ISO8601:log_time} %{GREEDYDATA:thread_name} %{LOGLEVEL:log_level} %{GREEDYDATA:message}" } }
  }
  date {
    match => ["timestamp","yyyy-MM-dd HH:mm:ss"]
  }
}
​
output {
   elasticsearch { hosts => ["10.66.105.43:9200"]
                   index => "hdp-logstash-%{+YYYY.MM.dd}"}
   stdout { codec => rubydebug }
}
​
#grok 提供的匹配可以详见:https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns
#可以使用Grok Debugger工具加以辅助对其filter进行配置。工具地址:https://grokdebug.herokuapp.com/
​

测试一下配置文件是否正确

bin/logstash --path.settings . -f ./logstash-hdp.conf --config.test_and_exit
​
#--path.settings 用于指定logstash的配置文件所在的目录
#-f 指定需要被检测的配置文件的路径
#--config.test_and_exit 指定检测完之后就退出,不然就会直接启动了
# "."表示当前路径
# 控制台显示 Configuration OK 即表示成功。
Configuration OK
[INFO ] 2018-12-11 14:56:41.501 [LogStash::Runner] runner - Using config.test_and_exit mode. Config Validation Result: OK. Exiting Logstash
  1. 启动logstash

    bin/logstash  -f logstash-hdp.conf
    #若要后台启动并且输出日志,请使用以下命令。
    nohup bin/logstash  -f logstash-hdp.conf > logs/logstash-hdp.log 2>&1 &
    #若不要日志 [因为logs目录中包含有日志],请使用以下指令
    nohup bin/logstash  -f logstash-hdp.conf > /dev/null &
    ​

    PS:

    logstash 比较庞大,最好的打开方式是在日志被收集的服务器中使用filebeat采集日志,然后输出到共用的logstash服务器中,只有由于logstash结合filebeat无法兼容logstash-codec-multiline的问题,而不得已为之。以下介绍其优化点。

    1、最简单的办法,提升当前服务器的cpu和内存配置
    ​
    2、进入config目前,配置jvm.options,对jvm进行调优。比如增加最大堆最小堆内存,若jvm的对内存大于6G,可以推荐使用G1的回收器等。
    ​
    3、修改pipeline.yml文件,合理增加pipeline.workers,pipeline.batch.size。注意增加了该配置参数后,堆内存也需要随之增加。

 

全部评论