docker(二十一)docker部署logstash

46 阅读2分钟

插件部署继续,docker部署logstash。

 

一:准备工作目录

创建目录:

/opt/docker/logstash/config
/opt/docker/logstash/data
/opt/docker/logstash/pipeline
/opt/docker/logstash/pipeline/mappings

 

二:准备配置文件

1:vim /opt/docker/logstash/config/ logstash.yml

http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.username: "xxxx"
xpack.monitoring.elasticsearch.password: "xxxxx"
xpack.monitoring.elasticsearch.hosts: [ "http://127.0.0.1:9200" ]

 

2:vim /opt/docker/logstash/pipeline/ logstash.conf

input {
  tcp {
    mode => "server"
    host => "0.0.0.0"  # 允许任意主机发送日志
    port => 5044 # logstash暴露的端口
    codec => json_lines    # 数据格式
  }
}
 
filter {
    ruby {
        # 将时间转成毫秒的时间戳
        code => "event.set('createTime',(event.get('@timestamp').to_f.round(3)*1000).to_i)"
    }
    ruby {
        # 设置一个自定义字段'timestamp'[这个字段可自定义],将logstash自动生成的时间戳中的值加8小时,赋给这个字段
    code => "
          event.set('timestamp', event.get('@timestamp').time.localtime + 8*3600)
          event.set('threadName', event.get('thread_name'))
          event.set('levelValue', event.get('level_value'))
          event.set('loggerName', event.get('logger_name'))
          event.set('callerClassName', event.get('caller_class_name'))
          event.set('callerFileName', event.get('caller_file_name'))
          event.set('callerLineNumber', event.get('caller_line_number'))
          event.set('callerMethodName', event.get('caller_method_name'))
          event.set('stackTrace', event.get('stack_trace'))
        "
    }
    ruby {
        # 将自定义时间字段中的值重新赋给@timestamp
        # code => "event.set('@timestamp',event.get('timestamp'))"
    }
    mutate {
        # 删除自定义字段
        remove_field => ["timestamp","thread_name","level_value","logger_name","HOSTNAME","caller_class_name","caller_file_name","caller_line_number","caller_method_name","stack_trace"]
    }
}
 
output {
  elasticsearch {
      hosts  => ["http://39.99.144.212:9200"]   # ElasticSearch 的地址和端口
      user   => "xxxxx"
      password => "xxxxx"
      # index  => "application-logs-%{[appName]}-%{[springProfile]}-%{+YYY-MM}"         # 指定索引名
      index  => "application-logs-%{+YYYY-MM-dd}"         # 指定索引名
      # document_type => "_doc"
      codec  => json
      # 是否使用模板创建索引,在模板中可提前定义索引的字段类型
      manage_template => true
      # 索引模板文件
      template => "/usr/share/logstash/pipeline/mappings/application-log-mapping.json"
      template_name => "application-log"
      # 在logstash重启后,是否使用模板文件覆盖es中已存在的索引模板
      template_overwrite => true
  }
  #stdout {
  #  codec => rubydebug
  #}
  file {
    # path => "/usr/share/logstash/pipeline/logs/%{+YYYY-MM-dd}-%{appName}-%{springProfile}.log"
    path => "/usr/share/logstash/pipeline/logs/%{+YYYY-MM-dd}.log"
  }
}

 

具体的功能代码中都有注释。参考即可。

 

3:vim /opt/docker/logstash/pipeline/mappings/ application-log-mapping.json

{
  "index_patterns": ["application-log*"],
  "order": 1,
  "mappings" : {
    "dynamic_templates" : [{
      "message_field" : {
        "match" : "message",
        "match_mapping_type" : "string",
        "mapping" : {
          "type" : "keyword",
          "index" : true
        }
      }
    }, {
      "string_fields" : {
        "match" : "*",
        "match_mapping_type" : "string",
        "mapping" : {
          "type" : "keyword",
          "index" : true
        }
      }
    }],
    "properties" : {
      "@timestamp": { "type": "date" },
      "@version": { "type": "keyword", "index": true },
      "message": {
        "type": "text",
        "analyzer": "ik_max_word"
      }
    }
  }
}

 

这里配置分词器,我这里配置的事ik分词器。

 

被坑了一天,7.X后的es,type 不是再是 string 而是 type="keyword" 或 type="text"

 

三:运行docker

1:docker命令运行

docker run -d --name logstash  \
  --privileged=true \
  -p 5044:5044 \
  -v /opt/docker/logstash/data/:/usr/share/logstash/data \
  -v /opt/docker/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml \
  -v /opt/docker/logstash/pipeline/:/usr/share/logstash/pipeline \
  logstash:7.17.3

 

2:docker-compose.yml运行

version"3.8"
services:
  logstash:
    container_name: logstash
    imagelogstash:7.17.3
    ports:
      - "5044:5044"
    environment:
      ES_JAVA_OPTS: -Xms64m -Xmx256m
    volumes:
      - /opt/docker/logstash/data/:/usr/share/logstash/data
      - /opt/docker/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml
      - /opt/docker/logstash/pipeline/:/usr/share/logstash/pipeline
    restart: always

 

使用命令运行:

docker compose -d up

 

到这里,docker部署logstash就完成了。

 

有好的建议,请在下方输入你的评论。