ELK: Elasticsearch + Logstash + Kibana

2023-05-21 00:08:55 726

接上文Elasticsearch和Kibana的安装

https://blog.22xcode.com/article/537114564689395713

这里安装最后一个组件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, 触发异常, 可以看到异常展示为了一行


Kubernetes Cloud Native 实践 ( 六 ) 集成ELK日志平台

全文目录Kubernetes Cloud Native 实践 ( 一 ) 安装Kubernetes Cloud Native 实践 ( 二 ) 简单使用Kubernetes Cloud Native 实践 ( 三 ) NFS/PV/PVCKubernetes Cloud Native 实践 ( 四
2023-06-13
ELK: Elasticsearch + Logstash + Kibana

ELK: Elasticsearch + Logstash + Kibana

接上文Elasticsearch和Kibana的安装https://blog.22xcode.com/post/182这里安装最后一个组件Logstashdocker pull logstash:8.7.1docker run -d --name=logstash logstash:8.7.1把容器
2023-05-21
SkyWalking for Java

SkyWalking for Java

Skywalking的性能损耗接近3%一. Docker配置docker pull apache/skywalking-oap-server:9.4.0-java17docker pull apache/skywalking-ui:v9.4.0-java17docker pull elasticse
2023-05-19

freemarker 时间显示不正常 设置时区

项目在本地开发的时候显示正常,部署上服务器就一直差8个小时,最后发现freemarker官方文档有这样的说明time_zone:时区的名称来显示并格式化时间。 默认情况下,使用JVM的时区。 也可以是 Java 时区 API 接受的值,或者 "JVM default" (从 FreeMarker 2
2020-03-28
IDEA 2019.1 xml 不高亮

IDEA 2019.1 xml 不高亮

前几天更新了idea后,发现xml里的代码都没有了高亮,变得跟记事本一个德性了打开setting ,搜索 File Types,找到xml项, 查看下方的匹配格式,果然没有xml,(idea真是厉害)点击右方的+,输入*.xml,点击ok,解决问题
2020-03-28

npm install 淘宝镜像

npm install --registry=https://registry.npm.taobao.org
2020-03-28
Java中方法的参数传递机制

Java中方法的参数传递机制

来看一段代码 public class Man { private String name; private Integer age; public String getName() { return name; } publi
2020-03-28
基于自定义注解手写权限控制

基于自定义注解手写权限控制

方法一: AOP 方法二: 拦截器项目结构项目依赖<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-w
2020-03-28

Docker 部署 详细全过程 附代码

Docker 部署本站 全过程环境:CentOS7.61. 安装Docker其他版本CentOS可以参考这个https://help.aliyun.com/document_detail/187598.html查看本机内核版本,内核版本需高于 3.10uname -r 确保 yum 包最新yum u
2020-03-28

SpringBoot 启动普通java工程

引入依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.0.9</version> </dependency>
2020-03-28

Vue.js DOM操作

<template> <input type="button" @click="reply($event)" value="回复"> </template> export default { methods: { replyFun(e) {
2020-03-29
CentOS7编译调试OpenJDK12

CentOS7编译调试OpenJDK12

1. 下载源码https://hg.openjdk.java.net/jdk/jdk12点击左侧的browse,再点击zip,就可以下载zip格式的源码压缩包。unzip xxx.zip 解压文件2. 安装jdkyum install java-11-openjdk-devel -y3. 运行con
2020-04-23
编写自己的Spring Boot Starter

编写自己的Spring Boot Starter

1.新建一个maven项目命名规则统一是xxx-spring-boot-starter完整pom.xml<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"
2020-06-29