如何搭建 ELK【elasticsearch+logstash+kibana】日志分析系统

一、为什么需要日志分析系统?

日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误

往往单台机器的日志我们使用 grep、awk 等工具就能基本实现简单分析,但是当日志被分散的储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。

如果:

• 你有很多台机器
• 你有各种各样的Log

只要满足这两个条件其中之一,那么一套日志系统是很有必要的。优秀的日志系统可以让你及时发现问题,轻松追查故障原因,进而提高生产力。

二、什么是 ELK

ELKelasticsearch + logstash + kibanaELK 平台是一套完整的日志集中处理解决方案,将 ElasticSearchLogstashKiabana 三个开源工具配合使用, 完成更强大的用户对日志的查询、排序、统计需求。

  • Logstash:用于收集并处理日志,将日志信息存储到 Elasticsearch 里面
  • Elasticsearch:用于存储收集到的日志信息
  • Kibana :通过Web端的可视化界面来查看日志(数据可视化)

ELK 的工作原理

  1. 在所有需要收集日志的服务器上部署 Logstash;或者先将日志进行集中化管理在日志服务器上,在日志服务器上部署 Logstash
  2. Logstash 收集日志,将日志格式化并输出到 Elasticsearch 中。
  3. Elasticsearch 对格式化后的数据进行索引和存储。
  4. Kibana 从 ES 群集中查询数据生成图表,并进行前端数据的展示。

三、搭建 ELK

1.安装 elasticsearch

https://blog.csdn.net/ShockChen7/article/details/142760578

2.安装kibana

https://blog.csdn.net/ShockChen7/article/details/142760578

3.安装logstash

1.拉取 logstash镜像

bash 复制代码
docker pull logstash:8.8.1 

2.创建并运行容器

使用以下命令创建一个新的 logstash 容器并将其启动:

typescript 复制代码
docker run --name some-logstash \
  -e ES_JAVA_OPTS="-Xms1g -Xmx2g" \
  -e TZ=Asia/Shanghai \
  -p 5044:5044 \
  -p 5000:5000 \
  -d logstash:8.8.1 

创建挂载目录、复制数据卷

bash 复制代码
mkdir -vp /root/my-logstash
#赋于权限
sudo chown -R 1000:1000 /root/my-logstash
#复制数据卷
docker cp some-logstash:/usr/share/logstash/config /root/my-logstash/
docker cp some-logstash:/usr/share/logstash/pipeline /root/my-logstash/

注:下载的包一定要和 ElasticSearch 的版本一致,我这边选择的版本是8.8.1

3.配置

LogstashSettings 配置文件通常是 logstash.yml,这是 Logstash 的全局配置文件,用于设置 Logstash 运行的一些基本参数。

在本地编辑文件

bash 复制代码
vim /root/my-logstash/config/logstash.yml

logstash.yml 末尾加上以下配置,文件的作用是为 Logstash 配置全局参数,比如日志级别、管道线程数、队列类型等。

bash 复制代码
http.host: "0.0.0.0"
xpack.monitoring.enabled: true
# xpack.monitoring.elasticsearch.username: logstash_system  #es xpack账号密码
# xpack.monitoring.elasticsearch.password: "123456"
xpack.monitoring.elasticsearch.hosts: ["http://127.0.0.1:9200"]

修改 logstash.conf 为以下配置,默认的基础上,将 inputbeat 改为 tcp 端口 5044

bash 复制代码
vim /root/my-logstash/pipeline/logstash.conf
bash 复制代码
input {
  tcp {
    port => 5044
    ##格式json  否则中文会变成unicode编码
	codec => json_lines 
    
  }
}

output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "my_log-%{+YYYY.MM.dd}"
    #user => "elastic" #es xpack账号密码
    #password => "changeme"
  }
}

注意 :如果你的 es 运行在 docker 中,这里的配置中包括上面的,不能是 localhost ,而应该是你 docker 容器的 IP

使用命令可以查看指定容器的IP

bash 复制代码
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' your_container_name

另一种做法是将 eslogstashkibana 放在同一个 docker 网络中

4.停止、删除容器

bash 复制代码
docker stop some-logstash
docker rm some-logstash

5.重新挂载文件启动容器

bash 复制代码
docker run --name some-logstash \
  -e ES_JAVA_OPTS="-Xms1g -Xmx2g" \
  -e TZ=Asia/Shanghai \
  --restart=always --privileged=true \
  -v /root/my-logstash/config:/usr/share/logstash/config \
  -v /root/my-logstash/pipeline:/usr/share/logstash/pipeline \
  -p 5044:5044 \
  -p 5000:5000 \
  -d logstash:8.8.1 

6.检查可用性

检测 Docker 中的 Logstash 是否能够正常接收和打印消息

可以参考这篇文章:https://blog.csdn.net/weixin_50382197/article/details/139107762?fromshare=blogdetail&sharetype=blogdetail&sharerId=139107762&sharerefer=PC&sharesource=ShockChen7&sharefrom=from_link

四、springboot项目集成

1.添加logstash依赖

xml 复制代码
<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>7.0.1</version>
</dependency>

2.准备logback-spring.xml文件

放在 src/main/resources 下面即可:

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml" />
    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
    <!--    此处填写的是logstash采集日志的端口    -->
     <destination>192.168.11.131:5044</destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />
    </appender>
    <root level="INFO">
    	<!-- 配置哪个级别使用该appender -->
        <appender-ref ref="LOGSTASH" />
    </root>
</configuration>

Spring Boot 官方推荐优先使用带有 -spring 的文件名作为你的日志配置(如使用 logback-spring.xml ,而不是 logback.xml ),命名为 logback-spring.xml 的日志配置文件,spring boot 可以为它添加一些spring boot 特有的配置项

3.进行测试

java 复制代码
package com.ruoyi.web;
 
import com.ruoyi.common.utils.http.HttpUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
public class Test {
 
    private static final Logger log = LoggerFactory.getLogger(HttpUtils.class);
 
    public static void main(String[] args) {
        log.info("输出info");
        log.debug("输出debug");
        log.error("输出error");
    }
 
 
}

五、查看日志

使用Kibana的开发者工具

Kibana 开发者工具中执行如下语句可以查看到对应日志记录:

bash 复制代码
GET my_log-2024.11.01/_search
{
  "query": {
    "match_all": {}
  }
}

查询结果如下:

可以看到,这里的数据即我们代码中测试的相关日志。但这里的结果并不方便观察和整理。并且时间格式也不理想,时区也并不是北京时间。

使用 Kibana 的 Discover 功能

进入后创建一个数据视图:

创建时,输入名称,和索引模式即可:

这里的索引模式需要和匹配的源对应,支持通配符,上图即使用 * 通配符创建。填写好后, 点击保存数据视图到 Kibana

创建好的数据视图如下:

六、添加es动态模板

根据上面的 logstash.conf 配置文件,动态生成的索引。数据结构除了 @timestamp 字段为date类型,其他的都将默认声明为 text 类型,即都将分词。如下:

bash 复制代码
GET my_log-2024.11.04/_mapping
bash 复制代码
{
  "my_log-2024.11.04": {
    "mappings": {
      "properties": {
        "@timestamp": {
          "type": "date"
        },
        "@version": {
          "type": "long"
        },
        "level": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "level_value": {
          "type": "long"
        },
        "logger_name": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "message": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "thread_name": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        }
      }
    }
  }
}

这会导致浪费大量的空间和性能,比如我们的 logger_namethread_namelevel 字段,完全没有必要进行分词,精准查找即可,所以现在我们需要在 logstash 上传日志到es时,精准的建立字段的类型。这里采用es动态索引模板的方式。

使用 Kibana 开发者工具执行如下指令,创建索引模板:

bash 复制代码
PUT /_index_template/my_log_template  
{  
  "index_patterns": ["my_log-*"],   
  "template": {  
    "mappings": {  
      "properties": {  
        "@timestamp": {  
          "type": "date"  
        },  
        "data": {  
          "type": "text" ,
          "fields": {  
            "keyword": {  
              "type": "keyword",  
              "ignore_above": 256  
            }  
          }  
        },
        "level": {  
          "type": "keyword"  
        },  
        "logger_name": {  
          "type": "keyword"  
        },  
        "thread_name": {  
          "type": "keyword"  
        }  
      }  
    }
  }  
}

这个模板将自动应用于任何以 my_log- 开头的新索引。当让适用于以 my_log- 开头的索引名称。如果字段名称可以和模板对应上,那么字段类型将跟模板一致。

创建模板后,再次测试日志插入,查看类型,发现模板已经生效:

参考文章如下:

https://blog.csdn.net/www1056481167/article/details/128432478?fromshare=blogdetail&sharetype=blogdetail&sharerId=128432478&sharerefer=PC&sharesource=ShockChen7&sharefrom=from_link

https://blog.csdn.net/qq_38548730/article/details/141461285?fromshare=blogdetail&sharetype=blogdetail&sharerId=141461285&sharerefer=PC&sharesource=ShockChen7&sharefrom=from_link

https://blog.csdn.net/qq_36961226/article/details/139211386?fromshare=blogdetail&sharetype=blogdetail&sharerId=139211386&sharerefer=PC&sharesource=ShockChen7&sharefrom=from_link

相关推荐
Java 第一深情1 小时前
零基础入门Flink,掌握基本使用方法
大数据·flink·实时计算
MXsoft6181 小时前
华为服务器(iBMC)硬件监控指标解读
大数据·运维·数据库
PersistJiao2 小时前
Spark 分布式计算中网络传输和序列化的关系(二)
大数据·网络·spark·序列化·分布式计算
九河云2 小时前
如何对AWS进行节省
大数据·云计算·aws
FreeIPCC3 小时前
谈一下开源生态对 AI人工智能大模型的促进作用
大数据·人工智能·机器人·开源
梦幻通灵3 小时前
ES分词环境实战
大数据·elasticsearch·搜索引擎
Elastic 中国社区官方博客3 小时前
Elasticsearch 中的热点以及如何使用 AutoOps 解决它们
大数据·运维·elasticsearch·搜索引擎·全文检索
天冬忘忧4 小时前
Kafka 工作流程解析:从 Broker 工作原理、节点的服役、退役、副本的生成到数据存储与读写优化
大数据·分布式·kafka
sevevty-seven4 小时前
幻读是什么?用什么隔离级别可以防止幻读
大数据·sql
Yz98766 小时前
hive复杂数据类型Array & Map & Struct & 炸裂函数explode
大数据·数据库·数据仓库·hive·hadoop·数据库开发·big data