前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Cloud + ELK 统一日志系统搭建

Spring Cloud + ELK 统一日志系统搭建

作者头像
大数据真好玩
发布2021-01-26 16:12:23
2.9K0
发布2021-01-26 16:12:23
举报
文章被收录于专栏:暴走大数据暴走大数据

ELK 统一日志系统搭建

ELK 是 Elasticsearch、Logstash、Kibana 的简称,这三者是核心套件,但并非全部。

Elasticsearch 是实时全文搜索和分析引擎,提供搜集、分析、存储数据三大功能;是一套开放 REST 和 JAVA API 等结构提供高效搜索功能,可扩展的分布式系统。它构建于 Apache Lucene 搜索引擎库之上。

Logstash 是一个用来搜集、分析、过滤日志的工具。它支持几乎任何类型的日志,包括系统日志、错误日志和自定义应用程序日志。它可以从许多来源接收日志,这些来源包括 syslog、消息传递(例如 RabbitMQ)和 JMX,它能够以多种方式输出数据,包括电子邮件、websockets 和 Elasticsearch。

Kibana 是一个基于 Web 的图形界面,用于搜索、分析和可视化存储在 Elasticsearch 指标中的日志数据。它利用 Elasticsearch 的 REST 接口来检索数据,不仅允许用户创建他们自己的数据的定制仪表板视图,还允许他们以特殊的方式查询和过滤数据

项目使用版本(基于 Linux 系统搭建):

  • elasticsearch-7.3.0

下载地址:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.3.0-linux-x86_64.tar.gz

  • kibana-7.3.0

下载地址:https://artifacts.elastic.co/downloads/kibana/kibana-7.3.0-linux-x86_64.tar.gz

  • logstash-7.3.0

下载地址:https://artifacts.elastic.co/downloads/logstash/logstash-7.3.0.tar.gz

Elasticsearch 搭建

下载 Elasticsearch

代码语言:javascript
复制
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.3.0-linux-x86_64.tar.gz

解压 Elasticsearch

代码语言:javascript
复制
tar -zxvf elasticsearch-7.3.0-linux-x86_64.tar.gz

修改 Elasticsearch 的配置文件

代码语言:javascript
复制
cd elasticsearch-7.3.0/config/
vim elasticsearch.yml

由于默认的配置文件全注释掉了,所以直接在文件末尾添加。 注意:不同的版本对应的配置可以不一致,对照一下注释掉的文档是否包含以下配置。

代码语言:javascript
复制
# 如果需要部署集群,集群需要同样的集群名
cluster.name: my-application

# 每个 node 的名字需要唯一
node.name: node-1

# 注意一定要是路径后面加上/var/lib/elasticsearch/nodes,要不然无法加入集群,单机不需要
# path.data: /var/lib/elasticsearch/nodes
# path.logs: /var/log/elasticsearch

# 配置服务器的内网地址,有文档配置的 0.0.0.0 或 localhost,但是后面出现了问题,暂未研究什么原因
network.host: 192.168.0.146

# 配置端口号,默认 9200
http.port: 9200

# 配置集群节点,多个服务器["node-1", "node-2"]
cluster.initial_master_nodes: ["node-1"]
# discovery.seed_hosts: ["192.168.0.146", "192.168.0.147", "192.168.0.148"]

# 解决跨域
http.cors.enabled: true
http.cors.allow-origin: "*"

启动 Elasticsearch

其中/config/jvm.options 为启动的 JVM 配置,默认为-Xms1g -Xmx1g ….该配置根据自己的实际需求修改。 注意:启动时,不可以使用 root 用户。 进入 Elasticsearch 上级这里我们创建一个 elsearch 用户

代码语言:javascript
复制
# 创建 elsearch 组
groupadd elsearch
useradd  elsearch(用户名) -g elsearch(组名) -p elsearch(密码)

# 给新创建用户文件夹执行权限
chown -R elsearch:elsearch /usr/local/elasticsearch-7.3.0

# 切换 elsearch 用户
su elsearch

进入 bin 目录

代码语言:javascript
复制
sh elasticsearch &

启动成功后,访问 http://192.168.0.146:9200/ ,得到以下截图,表示启动成功。

安装 ElasticSearch 的 Head 插件

注意:安装 head 需要安装 node 和 npm 下载地址:https://github.com/mobz/elasticsearch-head.git 下载后执行:

代码语言:javascript
复制
# 安装 module
npm install
# 运行 head 插件
npm run start

访问界面 http://192.168.0.146:9100/ 得到以下界面,(我的以下界面,已经添加了日志)

常见的问题

  • 使用 root 用户启动,需要切换 elsearch 用户启动。
代码语言:javascript
复制
[2019-08-25T19:30:25,587][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [node-1] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root
    at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:163) ~[elasticsearch-7.3.0.jar:7.3.0]
    at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150) ~[elasticsearch-7.3.0.jar:7.3.0]
    at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[elasticsearch-7.3.0.jar:7.3.0]
    at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) ~[elasticsearch-cli-7.3.0.jar:7.3.0]
    at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-cli-7.3.0.jar:7.3.0]
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:115) ~[elasticsearch-7.3.0.jar:7.3.0]
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:92) ~[elasticsearch-7.3.0.jar:7.3.0]
Caused by: java.lang.RuntimeException: can not run elasticsearch as root
    at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:105) ~[elasticsearch-7.3.0.jar:7.3.0]
    at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:172) ~[elasticsearch-7.3.0.jar:7.3.0]
    at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:349) ~[elasticsearch-7.3.0.jar:7.3.0]
    at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159) ~[elasticsearch-7.3.0.jar:7.3.0]
    ... 6 more

具体参考:https://blog.csdn.net/u013083576/article/details/78499884 (这篇博客整理的比较全面,遇到了再补充)

Logstash 搭建

Logstash 下载

下载 Logstash

代码语言:javascript
复制
wget https://artifacts.elastic.co/downloads/logstash/logstash-7.3.0.tar.gz

解压 Logstash

代码语言:javascript
复制
tar -zxvf logstash-7.3.0.tar.gz

stash 第一个事件

Logstash 管道有两个必需元素,输入和输出,以及一个可选元素 filter。输入插件使用来自源的数据,过滤器插件在您指定时修改数据,输出插件将数据写入目标。

要测试 Logstash 安装成功,运行最基本的 Logstash 管道。执行以下的命令

代码语言:javascript
复制
 bin/logstash -e 'input { stdin { } } output { stdout {} }'

-e 标志使您可以直接从命令行指定配置。通过在命令行指定配置,可以快速测试配置,而无需在迭代之间编辑文件。示例中的管道从标准输入 stdin 获取输入,并以结构化格式将输入移动到标准输出 stdout。启动 Logstash 后,等到看到“Pipeline main started”,然后在命令提示符下输入 hello world,显示的如下:

代码语言:javascript
复制
hello world
{
          "host" => "VM_0_13_centos",
       "message" => "hello world",
      "@version" => "1",
    "@timestamp" => 2019-07-02T06:26:28.684Z
}

配置 logstash 输出到 elasticsearch

修改 logstash 的安装目录的 config 目录下的 logstash-sample.conf 文件

代码语言:javascript
复制
cd logstash-7.3.0/config/
vim logstash-sample.conf

修改完配置如下:

代码语言:javascript
复制
input {
  beats {
    port => 5044
  }
  tcp {
    port => 4569
    codec => "json"
  }
}

output {
  if[appname] != "" {
    elasticsearch {
      hosts => ["http://192.168.0.146:9200"]
      index => "%{[appName]}-%{+YYYY.MM.dd}"
    }
  } else {
    elasticsearch {
      hosts => ["http://192.168.0.146:9200"]
      index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
    }
  }
}

更多配置参照官网教程:https://www.elastic.co/guide/en/logstash/current/advanced-pipeline.html 其中:

  • beats 为结合 filebeat 使用。
  • tcp 为通过 tcp 协议的通道。注意 codec 为 json 格式。por 为请求的端口号。
  • elasticsearch 为输出到 elasticsearch ,也可以配置其他。更多详细见下面文档 配置详细解释 可以参考该 logstash 手册:https://doc.yonyoucloud.com/doc/logstash-best-practice-cn/getstart/helloworld.html

logstash 结合 filebeat 使用

logstash 结合 filebeat 在分布式系统中,一台主机可能有多个应用,应用将日志输出到主机的指定目录,这时由 logstash 来搬运日志并解析日志,然后输出到 elasticsearch 上。由于于 logstash 是 java 应用,解析日志是非的消耗 cpu 和内存,logstash 安装在应用部署的机器上显得非常的笨重。最常见的做法是用 filebeat 部署在应用的机器上,logstash 单独部署,然后由 filebeat 将日志输出给 logstash 解析,解析完由 logstash 再传给 elasticsearch。

下载 filebeat,下载命令如下:

代码语言:javascript
复制
wget  https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.0-linux-x86_64.tar.gz
tar -zxvf filebeat-7.3.0-linux-x86_64.tar.gz
cd /filebeat-7.3.0-linux-x86_64/

vim filebeat.yml 修改配置:

代码语言:javascript
复制
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/service.log
output.logstash:
  hosts: ["192.168.1.146:5044"]

主要配置的是日志的搜集目录为/var/log/service.log,这个目录是应用 service 输出日志的文件。输出到 logstsh 的地址为 192.168.1.146

启动 filebeat,执行以下命令:

代码语言:javascript
复制
sudo chown root filebeat.yml
sudo ./filebeat -e >filebeat.log 2>&1 &

这样日志就传输到了 logstash, 然后通过 logstash 输出到 elasticsearch

具体效果需要结合 Kibana 或者通过 elasticsearch-head 查看

SpringCloud + logstash 结合 logbak 使用

在 pom 文件引用

代码语言:javascript
复制
        <!--logback 日志-->
        <dependency>
            <groupId>net.logstash.logback</groupId>
            <artifactId>logstash-logback-encoder</artifactId>
            <version>5.2</version>
        </dependency>

在 resources 添加 logbak 的配置文件 logback-spring.xml:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds">
    <!-- 定义参数 -->
    <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n" />
    <!-- 控制台打印设置 -->
    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>

    <!-- logstash 设置 -->
    <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <param name="Encoding" value="UTF-8"/>
        <!-- logstash 服务器 ip -->
        <remoteHost>192.168.0.146</remoteHost>
        <!-- logstash tcp 端口-->
        <port>4569</port>
        <!-- <filter class="com.program.interceptor.ELKFilter"/>-->//引入过滤类
        <!-- encoder is required -->
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" >
            <customFields>{"appname":"ceshi"}</customFields> // 索引名
        </encoder>
    </appender>

    <root level="info">
        <appender-ref ref="consoleAppender" />
        <appender-ref ref="logstash"/>
    </root>
</configuration>

其中{"appname":"ceshi"} 对应 logstash 配置文件中的 appname,为创建的索引名。可以在 Kibana 索引管理中根据名称进行分区搜索。根据自己的需求来,这里只做演示。

编写测试方法:

代码语言:javascript
复制
@Slf4j
@RestController
public class TestController {
    @RequestMapping(value = "/test")
    public String test(String id) {
        log.info("这是一个日志测试的 controller");
        return "这是一个日志测试的 controller";
    }
}

请求该方法,在 Kibana 中便可搜索到这条消息。(我这里做了接口拦截日志,展示的有些不一致,这里只做效果展示用)

Kibana 搭建

kibana 作为 ElastciSearch 的数据查询展示界面,集成了很多的功能,本文主要讲述如下部署 kibana。

下载 Kibana

代码语言:javascript
复制
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.3.0-linux-x86_64.tar.gz

解压 Kibana

代码语言:javascript
复制
tar -zxvf kibana-7.3.0-linux-x86_64.tar.gz

修改 Kibana 的配置文件

代码语言:javascript
复制
cd kibana-7.3.0/config/
vim kibana.yml

修改配置文件如下:

代码语言:javascript
复制
# 端口
server.port: 5601
# 指定本机 ip 让外部能访问
server.host: "0.0.0.0"
# 请求数据指向的 elasticsearch 服务器
elasticsearch.hosts: ["http://192.168.0.146:9200"]

配置完启动 kibana,进入 bin 目录执行

代码语言:javascript
复制
sh kibana &

访问 http://192.168.0.146:5601, 得到以下页面,代表启动成功。

查看通过 logstash 传输的日志列表

配置索引模式

查看日志

本文就到这里了,这里只是简单的介绍了 ELK 的基础安装使用,更多的高级功能,还需要小伙伴自己去挖掘。如果有什么问题,欢迎留言讨论。

版权声明:

本文为《大数据真好玩》整理,原作者独家授权。未经原作者允许转载追究侵权责任。

编辑|冷眼丶

微信公众号|大数据真好玩

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据真好玩 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Elasticsearch 搭建
    • 下载 Elasticsearch
      • 修改 Elasticsearch 的配置文件
        • 启动 Elasticsearch
          • 安装 ElasticSearch 的 Head 插件
            • 常见的问题
            • Logstash 搭建
              • Logstash 下载
                • stash 第一个事件
                  • 配置 logstash 输出到 elasticsearch
                    • logstash 结合 filebeat 使用
                      • SpringCloud + logstash 结合 logbak 使用
                      • Kibana 搭建
                        • 下载 Kibana
                          • 修改 Kibana 的配置文件
                          相关产品与服务
                          Elasticsearch Service
                          腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档