Loading... ## 一、前言 我这里有一个需求,需要将日志存储到`Elasticsearch`,我们使用的是`Logstash`,接收日志,并使用`kibana`做可视化。我自己比较喜欢用`docker`,所以现在参考各种教程,使用`docker`进行部署。我这里因为不好收集日志,我使用`mysql`模拟日志来源,输出到`Elasticsearch` ## 二、介绍 ### 1.Elasticsearch Elasticsearch是一个开源的搜索和分析引擎,用于存储、搜索和分析大量的结构化和非结构化数据。它基于Apache Lucene引擎,提供了快速、实时的全文搜索能力,并支持复杂的查询、聚合和过滤操作。Elasticsearch具有高可用性、可扩展性和容错性,并支持水平扩展到数百台服务器。 ### 2.Logstash Logstash是一个开源的数据收集、处理和传输工具,用于从各种来源(如日志文件、数据库、消息队列)中收集数据,并将其转换为统一的格式。Logstash可以对数据进行过滤、解析和转换,然后将其发送到各种目标,如Elasticsearch、消息队列等。它支持多种输入和输出插件,可以通过配置文件进行灵活的定制。 ### 3.Kibana Kibana是一个开源的数据可视化平台,用于在Elasticsearch上进行数据分析和可视化。Kibana提供了丰富的图表、仪表盘和地理信息展示功能,可以帮助用户深入挖掘数据并发现有价值的信息。用户可以通过Kibana轻松地创建自定义仪表盘、图形和报告,并与Elasticsearch进行交互,以便实时监测和分析数据。 ## 三、版本问题 现在最新的版本是8.x版本,但是我担心最新版不稳定,打算寻找以前的版本,我找到7.17.7版本是Elasticsearch、Logstash、Kibana三者共有的(2023年11月14日),其他的版本有可能三者还没更新,比如我现在能在docker hub找到Elasticsearch 7.17.14,但是Kibana却最高只有7.17.7。按照官方要求,版本必须使用统一的,那我就选择了统一的7.17.7。MySQL使用5.7版本。 ## 四、搭建MySQL作为日志来源 参考以下文章进行搭建 <div class="preview"> <div class="post-inser post box-shadow-wrap-normal"> <a href="https://blog.fivk.cn/archives/1691.html" target="_blank" class="post_inser_a no-external-link no-underline-link"> <div class="inner-image bg" style="background-image: url(https://blog.fivk.cn/usr/uploads/2023/02/2531134993.png);background-size: cover;"></div> <div class="inner-content" > <p class="inser-title">【Docker】docker启动mysql 5.x简单方法</p> <div class="inster-summary text-muted"> 1、拉取Mysql镜像我们可以去docker hub下载Mysql镜像1.1 先搜索MySql1.2 找到对应版本... </div> </div> </a> <!-- .inner-content #####--> </div> <!-- .post-inser ####--> </div> 新建测试表 ```mysql DROP TABLE IF EXISTS `sys_log`; CREATE TABLE `sys_log` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '日志主键', `title` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '模块标题', `business_type` int(2) NULL DEFAULT 0 COMMENT '业务类型(0其它 1新增 2修改 3删除)', `method` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '方法名称', `request_method` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '请求方式', `oper_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '操作人员', `oper_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '请求URL', `oper_ip` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '主机地址', `oper_time` datetime(0) NULL DEFAULT NULL COMMENT '操作时间', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 1585197503834284034 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '操作日志记录' ROW_FORMAT = Dynamic; SET FOREIGN_KEY_CHECKS = 1; ``` ## 五、搭建ELK ### 5.1.创建docker资源挂载路径 Elasticsearch挂载 ```bash mkdir -p /docker/elk/elasticsearch/{config,plugins,data,logs} ``` kibana挂载: ```bash mkdir -p /docker/elk/kibana/config ``` logstash挂载: ```text mkdir -p /docker/elk/logstash/config ``` ### 5.2.Elasticsearch挂载配置文件 输入`vim /docker/elk/elasticsearch/config/elasticsearch.yml` 编辑内容如下 ```yaml http.host: 0.0.0.0 xpack.security.enabled: false ``` - http.host:任何地址都可以访问。 - xpack.security.enabled:关闭密码认证 ### 5.3.Kibana挂载配置文件 输入`vim /docker/elk/kibana/config/kibana.yml` 编辑内容如下 ```yaml server.host: 0.0.0.0 elasticsearch.hosts: [ "http://192.168.xxx.xxx:9200" ] ``` - server.host : 任何地址都可范文。 - elasticsearch.hosts:指向Elasticsearch地址 ### 5.4.Logstash挂载具体配置 输入`vim /docker/elk/logstash/config/logstash.yml` 编辑内容如下 ```yaml http.host: 0.0.0.0 xpack.monitoring.elasticsearch.hosts: [ "http://192.168.xxx.xxx:9200" ] ``` - http.host:任何地址都可以访问。 - xpack.monitoring.elasticsearch.hosts: 指向Elasticsearch地址 存放日志配置`cd /docker/elk/logstash/config` ```bash touch log chmod 777 log ``` 输入`vim /docker/elk/logstash/config/logstash.conf` 编辑内容如下 ```js input { stdin { } jdbc { jdbc_connection_string => "jdbc:mysql://192.168.xxx.xxx:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC" jdbc_user => "root" jdbc_password => "123456" jdbc_driver_library => "/usr/share/logstash/config/mysql-connector-java-5.1.49.jar" jdbc_driver_class => "com.mysql.jdbc.Driver" jdbc_paging_enabled => "true" jdbc_page_size => "300000" statement => "SELECT id, title, business_type, method, request_method, oper_name, oper_url, oper_ip, oper_time FROM sys_log" schedule => "*/1 * * * *" use_column_value => false tracking_column_type => "timestamp" tracking_column => "oper_time" record_last_run => true jdbc_default_timezone => "Asia/Shanghai" last_run_metadata_path => "/usr/share/logstash/config/log" } } output { elasticsearch { hosts => ["192.168.xxx.xxx:9200"] index => "sys_log" document_id => "%{id}" } stdout { codec => json_lines } } ``` - `jdbc_driver_library`:指定必须要自己下载`mysql-connector-java-5.1.49.jar`,版本自己决定,[下载地址](https://mvnrepository.com/artifact/mysql/mysql-connector-java); - `statement`:如果sql长,可以指定sql文件,直接指定文件所在位置,**这里的位置都为容器内部的地址**; - `last_run_metadata_path`:上次记录存放文件对应上方的log。 流水线指定上面的配置文件: 输入`vim /docker/elk/logstash/config/pipelines.yml` 编辑内容如下 ```yaml - pipeline.id: sys_log path.config: "/usr/share/logstash/config/logstash.conf" ``` <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-9bdf440dda7085ee5703da05d28cc9e336" aria-expanded="true"><div class="accordion-toggle"><span style="">pipelines.yml文件配置说明</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-9bdf440dda7085ee5703da05d28cc9e336" class="collapse collapse-content"><p></p> 在 pipelines.yml 文件中,每个流水线配置都以 - 开头,表示一个列表项。列表项用于列出多个流水线的配置。 每个流水线配置由 - 开头的行开始,后面是该流水线的相关配置键值对。通过使用 - 来定义多个流水线配置,Logstash 将会依次加载这些配置,并按照顺序执行它们。 例如,在 pipelines.yml 文件中添加多个流水线配置的示例: ```yaml - pipeline.id: app_log path.config: "/usr/share/logstash/config/app-log.conf" - pipeline.id: web_log path.config: "/usr/share/logstash/config/web-log.conf" ``` <p></p></div></div></div> 最终`/docker/elk/logstash/config/`下的文件 ![](https://blog.fivk.cn/usr/uploads/2023/11/2025698461.png) 防止保存没有修改权限,可以把上面建的文件夹和文件赋予修改权限: ```bash sudo chmod -R 777 文件名 ``` ## 六、运行容器 ### 方法一:使用docker-compose 在elk目录创建: ```bash vim docker-compose.yml ``` 内容如下: ```yaml version: '3' services: elasticsearch: image: elasticsearch:7.17.7 container_name: elasticsearch ports: - "9200:9200" - "9300:9300" environment: - cluster.name=elasticsearch - discovery.type=single-node - "ES_JAVA_OPTS=-Xms512m -Xmx512m" volumes: - /docker/elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins - /docker/elk/elasticsearch/data:/usr/share/elasticsearch/data - /docker/elk/elasticsearch/logs:/usr/share/elasticsearch/logs kibana: image: kibana:7.17.7 container_name: kibana ports: - "5601:5601" depends_on: - elasticsearch environment: I18N_LOCALE: zh-CN volumes: - /docker/elk/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml logstash: image: logstash:7.17.7 container_name: logstash ports: - "5044:5044" volumes: - /docker/elk/logstash/config:/usr/share/logstash/config depends_on: - elasticsearch ``` 一定要在`docker-compose.yml`所在目录执行命令!! 运行: ```bash docker-compose up -d ``` 停止:(会移除容器) ```bash docker-compose down ``` ![](https://blog.fivk.cn/usr/uploads/2023/11/3891458006.png) 完成后可以查看kibana:http://192.168.xxx.xxx:5601/app/home#/ ### 方法二:逐个启动 #### 1.运行elasticsearch ```bash docker run --name elasticsearch \ -p 9200:9200 -p 9300:9300 \ -e "discovery.type=single-node" \ -e ES_JAVA_OPTS="-Xms64m -Xmx512m" \ -v /docker/elk/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \ -v /docker/elk/elasticsearch/data:/usr/share/elasticsearch/data \ -v /docker/elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins \ -d elasticsearch:7.17.7 ``` > 如果你没有设置 `-e ES_JAVA_OPTS="-Xms64m -Xmx512m"`,则 Elasticsearch 容器将使用其默认的 Java 内存选项。在大多数情况下,默认的 Java 内存选项是根据 Docker 主机的可用内存自动计算的。 > > 根据 Elasticsearch 7.x 的官方文档,默认的 Java 堆大小为物理内存的一半,最小为 `2GB`,最大为 `32GB`。因此,如果你没有显式地指定 Java 内存选项,Elasticsearch 将根据主机的可用内存自动选择堆大小,并将其限制在默认范围内。 > > 请注意,如果主机的可用内存不足以满足默认范围(例如,主机只有 `1GB` 可用内存),Elasticsearch 可能会启动失败或性能受到影响。在这种情况下,你可能需要显式指定适合你环境的 Java 内存选项来确保 Elasticsearch 正常运行。 #### 2.运行Kibana ```bash docker run --name kibana \ -e ELASTICSEARCH_HOSTS=http://192.168.xxx.xxx:9200 \ -p 5601:5601 \ -d kibana:7.17.7 ``` 或者通过之前写的配置文件 ```bash docker run --name kibana \ -v /docker/elk/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml \ -p 5601:5601 \ -d kibana:7.17.7 ``` #### 3. 运行Logstash ```bash docker run -d -p 5044:5044 \ -v /docker/elk/logstash/config:/usr/share/logstash/config \ --name logstash \ logstash:7.17.7 ``` ## 七、测试 新增几条记录 ```mysql INSERT INTO `sys_log` (`title`, `business_type`, `method`, `request_method`, `oper_name`, `oper_url`, `oper_ip`, `oper_time`) VALUES ('模块1', 1, '方法1', 'GET', '操作人员1', 'http://example.com/1', '192.168.0.1', '2022-01-01 10:00:00'), ('模块2', 2, '方法2', 'POST', '操作人员2', 'http://example.com/2', '192.168.0.2', '2022-01-02 11:00:00'), ('模块3', 3, '方法3', 'PUT', '操作人员3', 'http://example.com/3', '192.168.0.3', '2022-01-03 12:00:00'), ('模块4', 1, '方法4', 'DELETE', '操作人员4', 'http://example.com/4', '192.168.0.4', '2022-01-04 13:00:00'), ('模块5', 2, '方法5', 'GET', '操作人员5', 'http://example.com/5', '192.168.0.5', '2022-01-05 14:00:00'); ``` 然后查看Logstash日志 ```text docker logs -f logstash ``` ![](https://blog.fivk.cn/usr/uploads/2023/11/1635832612.png) 我们去kibana看一下是否已存在: 输入命令: ```json GET /sys_log/_search { "query": { "match_all": {} } } ``` 我们看到存在5条,则表示测试成功! ![](https://blog.fivk.cn/usr/uploads/2023/11/3434082822.png) 最后修改:2023 年 12 月 12 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 3 如果觉得我的文章对你有用,请随意赞赏