ELK: Elasticsearch + Logstash + Kibana

kyaa111 1年前 ⋅ 444 阅读

接上文Elasticsearch和Kibana的安装

https://blog.22xcode.com/post/182

这里安装最后一个组件Logstash

  1. docker pull logstash:8.7.1
  2. docker run -d --name=logstash logstash:8.7.1
  3. 把容器内的配置文件拷贝出来. docker cp logstash:/usr/share/logstash/config/ /usr/local/logstash/newconfig/
  4. 修改logstash.yml
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://172.19.0.8:9200" ]

#Logstash将其日志写到的目录
path.logs: /usr/share/logstash/logs
  1. 新建conf.d文件夹
  2. 新增文件conf.d/logstash-user-web-debug.conf
input {
  file {
    #标签
    type => "systemlog-localhost"
    path => "/usr/app-log/user-web/logs/debug.log"
    #开始收集点
    start_position => "beginning"
    #扫描间隔时间,默认是1s
    stat_interval => "1"
  }
}


filter {
  dissect {
    mapping => {
      "message" => "[%{date}] [%{application}] [%{ip}] [TID:%{tid}] [%{thread}] [%{level}] [[[[%{info}]]]]"
    }
  }
  date {
    match => ["date", "ISO8601"]
    timezone => "Asia/Shanghai"
  }
}

output {
  elasticsearch {
    #集群的话,直接添加多个url
    hosts => ["172.19.0.8:9200"]
    user =>"elastic"
    password =>"elastic"
    index => "logstash-system-debug-user-web-%{+YYYY.MM.dd}"
  }
  #在控制台输出logstash的日志
  stdout { codec=> rubydebug }
}

  1. 修改pipelines.yml
- pipeline.id: main
  path.config: "/usr/share/logstash/pipeline"

# 多个管道就定义多个配置 从而实现多应用分级别的日志搜集
- pipeline.id: user-web-debug
  queue.type: persisted
  path.config: "/usr/share/logstash/config/conf.d/logstash-user-web-debug.conf"
  1. 删除旧容器
  2. docker run -d --name=logstash --network rootnet -v /usr/local/app-log/:/usr/app-log/ -v /usr/local/logstash/config/:/usr/share/logstash/config/ logstash:8.7.1
  3. 在kibana中新建一个数据视图选择对应的index (logstash-system-debug-user-web-2023.05.20)就可以看到数据了

1.png

  1. 我们的logstash配置是根据日期创建index的, 每一天的日志都是一个index (优化查询性能). 所以需要一个别名匹配所有这种类型的index
  2. 在kibana中创建一个index templates, index pattern: logstash-system-debug-user-web-*
  3. 由于当前已经有日志数据了, 所以在新建数据视图时会选择不了新建的模板, 将logstash-system-debug-user-web-*的索引先删除, 再触发日志的输出
  4. 创建数据视图后效果如下
  5. 2.png
  6. 创建一个索引生命周期策略, 超过三天删除旧数据(实际环境中自由调整), 关联当前模板. 索引生命周期策略数据如下
POST _ilm/policy/custom-delete
{
  "policy": {
    "phases": {
      "hot": {
        "min_age": "0ms",
        "actions": {
          "rollover": {
            "max_primary_shard_size": "50gb",
            "max_age": "3d"
          }
        }
      },
      "warm": {
        "min_age": "0ms",
        "actions": {
          "forcemerge": {
            "max_num_segments": 1
          }
        }
      },
      "delete": {
        "min_age": "3d",
        "actions": {
          "delete": {
            "delete_searchable_snapshot": true
          }
        }
      }
    },
    "_meta": {
      "defaults": {
        "delete_min_age": "Using value of [3d] based on the monitoring plugin default"
      },
      "description": "Index lifecycle policy generated for [monitoring-*-8] data streams"
    }
  }
}
  1. 将当前生命周期策略关联上logstash-system-debug-user-web这个索引模板, 然后发现报错了: illegal_argument_exception: setting [index.lifecycle.rollover_alias] for index [xxx] is empty or not defined. 原因: 之前的索引生命周期在hot 阶段 启用了滚动更新,必须设置新增索引的别名才行
  2. 解决方案: 1. 关闭滚动更新(开启后可以设置索引超过多少g,或超过多少天,自动新创建一个索引,我们每天创建一个索引,所以用不到这个)2. 把原来已经应用策略的索引,先解除关联策略,再重新添加上策略,否则老索引还是无法正常自动删除
  3. error日志输出的stack在es中存储为了一条一条的记录. 可以通过安装logstash-filter-multiline插件解决.
  4. 进入logstash/bin目录下执行命令:./logstash-plugin install logstash-filter-multiline, 如果报错 certificate verify failed 则在install 后面加上 --no-verify
  5. 配置文件的filter节点加上 multiline { pattern => "^\s" what => "previous" }. 重启logstash, 触发异常, 可以看到异常展示为了一行