赞
踩
ELK是一组开源软件的首字母缩写,代表了Elasticsearch、Logstash和Kibana。它们都是由Elastic公司开发和维护的工具,通常结合使用来实现日志管理和分析。
ELK组合被广泛应用于日志管理、系统监控、安全分析等领域。通过Elasticsearch的强大搜索和分析能力、Logstash的数据收集和处理能力以及Kibana的直观可视化界面,ELK可以帮助用户更好地理解和利用海量数据。
Elasticsearch 是一个开源的分布式搜索和分析引擎,主要用于以下几个方面:
总的来说,Elasticsearch 主要用途包括但不限于文本搜索、数据分析、实时数据处理和全文检索。它被广泛应用于各种场景,包括企业搜索、日志分析、监控系统、电子商务平台等,为用户提供快速、可靠的数据搜索和分析能力。
本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。
是一款开源的可视化的elasticsearch可视化工具,使用相当方便和广泛。
http://192.168.70.127:9100/
http://192.168.70.127:9200/hello { "mappings": { "properties": { "id": { "type": "long" }, "title": { "type": "text", "analyzer": "standard" }, "content": { "type": "text", "analyzer": "standard" } } } }
logstash 7.2.0 4470777ac65e 4 years ago 836MB
kibana 7.2.0 3e581a516dcd 4 years ago 890MB
elasticsearch 7.2.0 0efa6a3de177 4 years ago 861MB
mobz/elasticsearch-head 5 b19a5c98e43b 6 years ago 824MB
redis latest e40e2763392d 3 weeks ago 138MB
mysql 8 412b8cc72e4a 8 months ago 531MB
kibana 8.11.3 bb428a138a34 13 days ago 1.03GB
logstash 8.11.3 a97f65931a6d 13 days ago 770MB
elasticsearch 8.11.3 ac1eef415132 13 days ago 1.41GB
通过官方给的 Docker仓库 https://hub.docker.com/(需要外网)
docker pull elasticsearch:8.11.3
docker pull kibana:8.11.3
docker pull logstash:8.11.3
elasticsearch ,kibana, logstash 最新的Docker版本(都一样)
8.11.3
8.11.2
7.17.16
搜索匹配指定关键字的文档 GET /my_index/_search { "query": { "match": { "title": "Elasticsearch" } } } 精确匹配指定字段的值 GET /my_index/_search { "query": { "term": { "category": "books" } } } 匹配指定范围内的值 GET /my_index/_search { "query": { "range": { "price": { "gte": 10, "lte": 50 } } } }
DSL(Domain Specific Language)是专用领域语言的缩写,它是一种为特定领域或问题而设计的编程语言。在 Elasticsearch 中,DSL 是一种用于构建查询和聚合操作的特定语法。
Elasticsearch 的 DSL 具有清晰的结构和丰富的功能,可以通过 JSON 格式的查询语句来进行索引的搜索和分析。DSL 提供了多种查询类型和聚合操作,可以帮助用户灵活地构建复杂的查询和分析逻辑。
DSL 在 Elasticsearch 中使用的主要组件如下:
DSL 的优势在于它提供了一种清晰、结构化的语法,使得用户可以更直观地构建复杂的查询和分析操作。通过灵活组合不同的查询类型和操作,DSL 可以满足各种搜索和分析需求,并提供高效的性能和精确度。
请注意,DSL 是 Elasticsearch 的一部分,用于构建查询和聚合操作的语言,与其他编程语言或查询语言略有不同。在使用 Elasticsearch 的 DSL 时,您需要熟悉其语法和功能,以便有效地利用 Elasticsearch 进行数据搜索和分析。
Hadoop 是一个开源的分布式存储和计算框架,专门用于存储和处理大数据。
Hadoop 主要包括以下两个核心组件:
除了 HDFS 和 MapReduce 之外,Hadoop 生态系统还包括了许多其他的项目和工具,例如 YARN(资源调度与管理)、Hive(数据仓库)、Pig(数据流编程)、HBase(分布式数据库)、Spark(内存计算框架)等。这些工具和项目使得 Hadoop 成为一个功能强大、灵活多样的大数据处理平台。
总的来说,大数据是指规模庞大的数据集合,而 Hadoop 则是针对大数据存储和处理而设计的分布式存储和计算框架,它能够帮助用户高效地存储、处理和分析大规模的数据。
HBase 是 Hadoop 生态系统中的一个分布式、可伸缩、面向列的 NoSQL 数据库,它建立在 Hadoop HDFS 上,并利用 Hadoop 的分布式计算能力。
HBase 的设计目标是提供高性能、高可靠性的数据存储和实时查询能力,适合存储大规模的结构化或半结构化数据。它的主要特点包括:
HBase 可以与其他大数据工具和组件集成使用,例如 Hive、Pig、Spark 等。它在大数据领域广泛应用于实时分析、数据存储和处理等场景,特别适合需要高吞吐量和低延迟的应用。
如果已经搭建好,访问4个IP如下
http://192.168.70.127:9200/ #es主页
http://192.168.70.127:9200/_cat/indices?v #es index主页
http://192.168.70.127:9600/ #LogStash
http://192.168.70.127:5601/ #Kibana
http://192.168.70.127:9100/ #es-head
docker pull elasticsearch:7.2.0
docker pull mobz/elasticsearch-head:5
docker pull kibana:7.2.0
docker pull logstash:7.2.0
docker run -d --restart=always --name es -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.2.0
docker run -d #后台运行容器
--restart=always #命令指示 Docker 在宿主机启动时自动重新启动容器,并且在容器退出时也自动重新启动。
--name es
-p 9200:9200 #-p (小写)映射端口号,主机端口:容器端口
-p 9300:9300
-e "discovery.type=single-node" #-e 指定启动容器时的环境变量
elasticsearch:7.2.0
docker exec -it es /bin/bash
# 进入配置文件夹
cd config
# 修改配置文件
vi elasticsearch.yml
# 加入跨域配置
http.cors.enabled: true
http.cors.allow-origin: "*"
docker restart es
{ "name" : "20ab9bd1d215", "cluster_name" : "docker-cluster", "cluster_uuid" : "eV2JJWaLS920xKzrzUtrxw", "version" : { "number" : "7.2.0", "build_flavor" : "default", "build_type" : "docker", "build_hash" : "508c38a", "build_date" : "2019-06-20T15:54:18.811730Z", "build_snapshot" : false, "lucene_version" : "8.0.0", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search" }
docker run -d --restart=always --name kibana --link es:elasticsearch -p 5601:5601 kibana:7.2.0
# 进入容器
docker exec -it kibana /bin/bash
# 进入配置文件夹
cd config
# 修改配置文件
vi kibana.yml
# 修改elasticsearch连接(如果是本机部署,ip需填写内网ip)
elasticsearch.hosts: [ "http://elasticsearch的ip地址:端口号" ]
# 加入中文配置(保存后重启kibana)
i18n.locale: "zh-CN"
docker restart kibana
http://192.168.70.127:5601/
安装ik分词器,下载ik.zip(版本必须和elasticsearch相同
)
https://github.com/medcl/elasticsearch-analysis-ik/releases
# 下载ik分词器 https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.2.0/elasticsearch-analysis-ik-7.2.0.zip # 解压后通过ftp上传到服务器下 # 将这个文件夹拷贝到elasticsearch中 #docker cp /home/silence/elk/ik es:/usr/share/elasticsearch/plugins docker cp ./ik es:/usr/share/elasticsearch/plugins #注意一定要自己新建 ik文件夹,然后解压。因为:elasticsearch-analysis-ik-7.2.0.zip,直接解压,会生成多个文件,不会创建文件夹 # 查看是否拷贝成功,进入elasticsearch/plugins/ik中: docker exec -it es /bin/bash cd /usr/share/elasticsearch/plugins ls cd ik ls # 重新启动elasticsearch容器 docker restart es
docker run -d --restart=always --name es_head -p 9100:9100 mobz/elasticsearch-head:5
docker pull logstash:7.2.0
docker run -d --restart=always --name logstash -p 5044:5044 -p 9600:9600 logstash:7.2.0
docker exec -it logstash /bin/bash
主要修改 es 的地址(如果是本机部署,ip需填写内网ip):
vi config/logstash.yml
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://elasticsearch的ip:端口号" ]
# 保存退出
:wq
vi pipeline/logstash.conf #注意不是这个文件 logstash.yml #vi pipeline/logstash.yml input { tcp { mode => "server" host => "0.0.0.0" # 允许任意主机发送日志 port => 5044 codec => json_lines # 数据格式 } } output { elasticsearch { hosts => ["http://192.168.70.127:9200"] # ElasticSearch 的地址和端口(如果是本机部署,ip需填写内网ip) index => "elk" # 指定索引名 codec => "json" } stdout { codec => rubydebug } } # 保存退出 :wq 默认是这样的 input { beats { port => 5044 } } output { stdout { codec => rubydebug } }
docker logs -f logstash
docker restart logstash
[2023-12-26T04:34:38,103][INFO ][logstash.outputs.elasticsearch] New Elasticsearch output {:class=>"LogStash::Outputs::ElasticSearch", :hosts=>["http://192.168.70.127:9200"]}
[2023-12-26T04:34:38,128][INFO ][logstash.outputs.elasticsearch] Using default mapping template
http://192.168.70.127:9200/_cat/indices?v
设置——索引模式——创建索引模式——输入elk
http://192.168.70.127:9200/_cat/indices?v
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open .kibana_1 eHdfc0pvT1-M_xuuYCl8BA 1 0 5 0 32.1kb 32.1kb
green open .kibana_task_manager 3TrHVIPiQHSGn5LFeA8bkw 1 0 2 9 16.5kb 16.5kb
yellow open elk nAzMwFr4QH-XL19UExpSRQ 1 1 16 0 50.9kb 50.9kb
pom.xml
文件中增加log4j2相关依赖 <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions><!-- 去掉logback配置 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--log4j2 相关版本最好选择最新版本-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
application-dev.yml
引入log4j2.xml日志配置文件# log4j2日志配置文件
logging:
config: classpath:config/log4j2-dev.xml
* log4j2-dev.xml
文件配置logstash两种连接方式:Socket连接
/Gelf连接
<!-- logstash Socket连接配置--> <Socket name="logstash" host="logstash部署ip地址" port="logstash部署端口号" protocol="TCP"> <PatternLayout pattern="${PATTERN}" /> <!--<JsonLayout properties="true"/>--> </Socket> <!-- logstash Gelf连接配置--> <!--<Gelf name="logstash-gelf" host="udp:logstash部署ip地址" port="logstash部署端口号" version="1.1" ignoreExceptions="true"> XXX </Gelf>--> <loggers> <root level = "info"> <appender-ref ref="Console"/> <appender-ref ref="RollingFileInfo"/> <appender-ref ref="RollingFileError"/> <!--<appender-ref ref="RollingFileWarn"/>--> <!--<appender-ref ref="RollingFileDebug"/>--> <!--<appender-ref ref="Filelog"/>--> <!-- logstash 配置--> <appender-ref ref="logstash" /> </root> </loggers>
<?xml version="1.0" encoding="UTF-8"?> <!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出--> <!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数--> <configuration monitorInterval="5"> <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --> <!--变量配置--> <Properties> <!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符--> <!-- %logger{36} 表示 Logger 名字最长36个字符 --> <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%p] [%c:%L] --- %m%n" /> <Property name="PATTERN">{"host": "%host", "logger": "%logger", "level": "%level", "message": "[%thread] [%c:%L] --- %message"}%n</Property> <!-- 定义日志存储的路径,不要配置相对路径 --> <property name="FILE_PATH" value="C:/springSecurity/" /> <property name="FILE_NAME" value="securitylog" /> </Properties> <appenders> <console name="Console" target="SYSTEM_OUT"> <!--输出日志的格式--> <PatternLayout pattern="${LOG_PATTERN}"/> <!--控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--> <ThresholdFilter level="Debug" onMatch="ACCEPT" onMismatch="DENY"/> </console> <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,适合临时测试用--> <File name="Filelog" fileName="${FILE_PATH}/test.log" append="false"> <PatternLayout pattern="${LOG_PATTERN}"/> </File> <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档--> <RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/info.log" filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz"> <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--> <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="${LOG_PATTERN}"/> <Policies> <!--interval属性用来指定多久滚动一次,默认是1 hour--> <TimeBasedTriggeringPolicy interval="1"/> <SizeBasedTriggeringPolicy size="10MB"/> </Policies> <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖--> <DefaultRolloverStrategy max="15"/> </RollingFile> <!-- 这个会打印出所有的warn及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档--> <RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/warn.log" filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz"> <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--> <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="${LOG_PATTERN}"/> <Policies> <!--interval属性用来指定多久滚动一次,默认是1 hour--> <TimeBasedTriggeringPolicy interval="1"/> <SizeBasedTriggeringPolicy size="10MB"/> </Policies> <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖--> <DefaultRolloverStrategy max="15"/> </RollingFile> <!-- 这个会打印出所有的error及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档--> <RollingFile name="RollingFileError" fileName="${FILE_PATH}/error.log" filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz"> <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--> <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="${LOG_PATTERN}"/> <Policies> <!--interval属性用来指定多久滚动一次,默认是1 hour--> <TimeBasedTriggeringPolicy interval="1"/> <SizeBasedTriggeringPolicy size="10MB"/> </Policies> <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖--> <DefaultRolloverStrategy max="15"/> </RollingFile> <!-- 这个会打印出所有的error及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档--> <RollingFile name="RollingFileDebug" fileName="${FILE_PATH}/debug.log" filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz"> <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--> <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="${LOG_PATTERN}"/> <Policies> <!--interval属性用来指定多久滚动一次,默认是1 hour--> <TimeBasedTriggeringPolicy interval="1"/> <SizeBasedTriggeringPolicy size="10MB"/> </Policies> <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖--> <DefaultRolloverStrategy max="15"/> </RollingFile> <!-- logstash Socket连接配置--> <Socket name="logstash" host="logstash部署ip地址" port="logstash部署端口号" protocol="TCP"> <PatternLayout pattern="${PATTERN}" /> <!--<JsonLayout properties="true"/>--> </Socket> <!-- logstash Gelf连接配置--> <!--<Gelf name="logstash-gelf" host="udp:logstash部署ip地址" port="logstash部署端口号" version="1.1" ignoreExceptions="true"> <Field name="timestamp" pattern="%d{yyyy-MM-dd HH:mm:ss.SSS}" /> <Field name="logger" pattern="%logger" /> <Field name="level" pattern="%level" /> <Field name="simpleClassName" pattern="%C{1}" /> <Field name="className" pattern="%C" /> <Field name="method" pattern="%M" /> <Field name="line" pattern="%L" /> <Field name="server" pattern="%host" /> </Gelf>--> </appenders> <!--Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。--> <!--然后定义loggers,只有定义了logger并引入的appender,appender才会生效--> <loggers> <!--过滤掉spring和mybatis的一些无用的DEBUG信息--> <logger name="org.mybatis" level="info" additivity="false"> <AppenderRef ref="Console"/> </logger> <!--监控系统信息--> <!--若是additivity设为false,则 子Logger 只会在自己的appender里输出,而不会在 父Logger 的appender里输出。--> <Logger name="org.springframework" level="info" additivity="false"> <AppenderRef ref="Console"/> </Logger> <Logger name="com.security.persisence" level="debug" additivity="false"> <AppenderRef ref="Console"/> <appender-ref ref="RollingFileDebug"/> </Logger> <AsyncLogger name="com.security" level="info" includeLocation="false" > <!--<appender-ref ref="Console"/>--> <appender-ref ref="logstash" /> </AsyncLogger> <root level = "info"> <appender-ref ref="Console"/> <appender-ref ref="RollingFileInfo"/> <appender-ref ref="RollingFileError"/> <!--<appender-ref ref="RollingFileWarn"/>--> <!--<appender-ref ref="RollingFileDebug"/>--> <!--<appender-ref ref="Filelog"/>--> <!-- logstash 配置--> <appender-ref ref="logstash" /> </root> </loggers> </configuration>
问题1:
Kibana 在config/kibana.yaml 中修改host ,把默认的 http://elasticsearch:9200
改为 http://localhost:9200
,启动报错,查看日志:
# docker logs 容器ID, 查看的日志信息:
# docker logs -tf es
2023-06-14 16:15:32 {"type":"log","@timestamp":"2023-06-14T08:15:32Z","tags":["warning","elasticsearch","admin"],"pid":1,"message":"No living connections"}
解决办法:
问题2:
logstash 修改文件:config/logstash.yml、pipeline/logstash.yml文件时,把elasticsearch的hosts中的IP地址改为localhost/127.0.0.1时,启动报错,查看日志:
2023-06-14 16:01:53 [2023-06-14T08:01:53,270][WARN ][logstash.outputs.elasticsearch] Attempted to resurrect connection to dead ES instance, but got an error. {:url=>"http://127.0.0.1:9200/", :error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :error=>"Elasticsearch Unreachable: [http://127.0.0.1:9200/][Manticore::SocketException] Connection refused (Connection refused)"}
解决办法:
config/logstash.yml
、pipeline/logstash.yml
文件里面elasticsearch
的hosts
IP地址改为主机的真实IP(内网172网段ip)docker IP查看
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-container
其他:轻量级日志
filebeat
docker pull docker.elastic.co/beats/filebeat:7.2.0
docker run -d --restart=always --name filebeat docker.elastic.co/beats/filebeat:7.2.0
https://blog.csdn.net/qq_40406380/article/details/131226485
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。