ELK日志分析系统搭建以及集成SpringBoot日志收集_master node changed {previous [], curr ent [{wg-28-程序员宅基地

技术标签: ELK  elk  springboot  

ELK安装步骤

简单介绍
  • ElasticSearch:用于存储日志信息。
  • Logstash:用于收集、处理和转发日志信息。
  • Kibana:提供可搜索的Web可视化界面。
准备工作安装JDK
  • Elasticsearch7 自带jdk11,如果没有安装jdk, es7使用缺省jdk11
  • 如果已安装,使用已安装的jdk,低于11有警告,但不影响使用。
  • 但是在安装Logstash还是需要java环境,所以建议还是安装一下jdk11
  • 安装jdk过程省略
安装Elasticsearch
#下载elasticsearch安装包
wget https://mirrors.huaweicloud.com/elasticsearch/7.7.0/elasticsearch-7.7.0-linux-x86_64.tar.gz
#解压
tar -xvf elasticsearch-7.7.0-linux-x86_64.tar.gz 

为Elasticsearch创建专属用户(Elasticsearch要求不能以root账户来运行)

#这里创建的用户名为haoxy
useradd haoxy
#为新创建的用户设置密码
passwd haoxy
#将安装权限归新用户所有
chown -R haoxy:haoxy /usr/local/elk/elasticsearch-7.7.0
#为elasticsearch运行准备修改系统配置文件
echo 'vm.max_map_count=262144' >> /etc/sysctl.conf
echo 'haoxy hard nofile 65536' >> /etc/security/limits.conf
echo 'haoxy soft nofile 65536' >> /etc/security/limits.conf

修改配置文件

#进入elasticsearch文件目录
cd elasticsearch-7.7.0/config
vi elasticsearch.yml
#打开这些配置的注释 ,然后填上对应的值
network.host: 你自己的服务器ip
http.port: 9200
discovery.seed_hosts: ["ip地址"]
#打开这个配置项
node-name
#node-1这个值是node-name配置的值,默认就是node-1
cluster.initial_master_nodes: ["node-1"]

启动Easticsearch

#切换角色
[root@localhost elasticsearch-7.7.0]# su suyu
#启动,建议第一次启动的时候先不要使用 -d 参数,因为第一次启动很有可能会有报错,如果你很自信就可以加上-d 
[haoxy@localhost elasticsearch-7.7.0]$ bin/elasticsearch -d

启动只有输出日志大致是这个样子:

a43f33) Copyright (c) 2020 Elasticsearch BV
[2020-09-04T15:16:13,769][INFO ][o.e.d.DiscoveryModule    ] [node-1] using discovery type [zen] and seed hosts providers [settings]
[2020-09-04T15:16:15,269][INFO ][o.e.n.Node               ] [node-1] initialized
[2020-09-04T15:16:15,270][INFO ][o.e.n.Node               ] [node-1] starting ...
[2020-09-04T15:16:15,484][INFO ][o.e.t.TransportService   ] [node-1] publish_address {10.1.56.75:9300}, bound_addresses {10.1.56.75:9300}
[2020-09-04T15:16:15,911][INFO ][o.e.b.BootstrapChecks    ] [node-1] bound or publishing to a non-loopback address, enforcing bootstrap checks
[2020-09-04T15:16:15,944][INFO ][o.e.c.c.Coordinator      ] [node-1] cluster UUID [aY5lgyvbRuqb61LQ8A6hKA]
[2020-09-04T15:16:16,304][INFO ][o.e.c.s.MasterService    ] [node-1] elected-as-master ([1] nodes joined)[{node-1}{ALYnSqgTTM2yRFGOvHhA_A}{zyCxSJGsS8y2ODCmZHJQNA}{10.1.56.75}{10.1.56.75:9300}{dilmrt}{ml.machine_memory=3974909952, xpack.installed=true, transform.node=true, ml.max_open_jobs=20} elect leader, _BECOME_MASTER_TASK_, _FINISH_ELECTION_], term: 2, version: 28, delta: master node changed {previous [], current [{node-1}{ALYnSqgTTM2yRFGOvHhA_A}{zyCxSJGsS8y2ODCmZHJQNA}{10.1.56.75}{10.1.56.75:9300}{dilmrt}{ml.machine_memory=3974909952, xpack.installed=true, transform.node=true, ml.max_open_jobs=20}]}
[2020-09-04T15:16:16,432][INFO ][o.e.c.s.ClusterApplierService] [node-1] master node changed {previous [], current [{node-1}{ALYnSqgTTM2yRFGOvHhA_A}{zyCxSJGsS8y2ODCmZHJQNA}{10.1.56.75}{10.1.56.75:9300}{dilmrt}{ml.machine_memory=3974909952, xpack.installed=true, transform.node=true, ml.max_open_jobs=20}]}, term: 2, version: 28, reason: Publication{term=2, version=28}
[2020-09-04T15:16:16,539][INFO ][o.e.h.AbstractHttpServerTransport] [node-1] publish_address {10.1.56.75:9200}, bound_addresses {10.1.56.75:9200}
[2020-09-04T15:16:16,540][INFO ][o.e.n.Node               ] [node-1] started
[2020-09-04T15:16:16,860][INFO ][o.e.l.LicenseService     ] [node-1] license [091daa59-1347-45db-8b02-b3e8b570315b] mode [basic] - valid
[2020-09-04T15:16:16,862][INFO ][o.e.x.s.s.SecurityStatusChangeListener] [node-1] Active license is now [BASIC]; Security is disabled
[2020-09-04T15:16:16,877][INFO ][o.e.g.GatewayService     ] [node-1] recovered [0] indices into cluster_state

然后在浏览器键入 ip:9200

image-20200904162234030

至此Easticsearch就安装完成了;

安装Logstash
#下载logstash安装包
wget https://mirrors.huaweicloud.com/logstash/7.7.0/logstash-7.7.0.tar.gz
#解压logstash
tar -xvf logstash-7.7.0.tar.gz 
#进入logstash配置文件夹下
cd logstash-7.7.0/config/
#文件中加入下面这段内
vim logstash.conf
##################################################
input {
    
  tcp {
    
    mode => "server"
    host => "10.1.56.75"    					#安装logstash的ip
    port => 4560                 				#设置logstash的端口
    codec => json_lines
  }
}
output {
    
  elasticsearch {
    
    hosts => ["10.1.56.75:9200"]    			#es的ip和端口(本次logstash和es是同一个服务器)
    index => "java-logstash-%{+YYYY.MM.dd}"     #es的index名称
    #user => "haoxy"							#es的账号
    #password => "haoxy"						#es的密码
  }
}
##################################################
#进入logstash-7.7.0/目录下启动,启动成功之后 win:crtl+c,mac:control+c 即可
bin/logstash -f config/logstash.conf &
安装Kibana
#切换到root角色下载kibana包
wget https://mirrors.huaweicloud.com/kibana/7.7.0/kibana-7.7.0-linux-x86_64.tar.gz
#解压
tar -xvf kibana-7.7.0-linux-x86_64.tar.gz 
#让这个文件夹可写
chmod 777 kibana-7.7.0-linux-x86_64
#将目录权限归我们创建新用户所有,这里也不能以root角色启动
chown -R haoxy:haoxy /usr/local/elk/kibana-7.7.0-linux-x86_64
#进入kibana目录
cd kibana-7.7.0-linux-x86_64
#修改配置文件
vim ./config/kibana.yml

#将这行配置打开,将值配置为elasticsearch服务器的ip地址
elasticsearch.hosts: ["http://10.1.56.75:9200"]
#打开这行配置,默认为localhost,改为0.0.0.0不改外网访问不了
server.host: "0.0.0.0"
#进入bin目录启动
cd bin/
#切换角色启动,这里也不准用root启动
su haoxy
#以后台形式启动 默认占用端口2601
./kibana &

启动成功日志大致如下:

到此我们的ELK就搭建完成了,登录到kibana可视化界面 http://10.1.56.75:5601

springboot集成ELK系统

然后启动springboot项目,在pom文件中依赖logstash插件,将日志文件发送到logstash中,logstash会将日志文件传到elasticsearch中,kibana拉取elasticsearch中的日志,我们就能看到日志啦

 <dependency>
      <groupId>net.logstash.logback</groupId>
      <artifactId>logstash-logback-encoder</artifactId>
      <version>5.3</version>
  </dependency>

在resourcet目录中添加日志的配置文件logback-spring.xml,修改destination为你自己的logstash的ip和端口就行

<?xml version="1.0" encoding="UTF-8"?>
<!--该日志将日志级别不同的log信息保存到不同的文件中 -->
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    <springProperty scope="context" name="springAppName"
                    source="spring.application.name"/>
    <springProperty scope="context" name="serverPort"
                    source="server.port"/>

    <!-- 日志在工程中的输出位置 -->
    <property name="LOG_FILE" value="${BUILD_FOLDER:-build}/${springAppName}"/>

    <!-- 控制台的日志输出样式 -->
    <property name="CONSOLE_LOG_PATTERN"
              value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>

    <!-- 控制台输出 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <!-- 日志输出编码 -->
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

    <!-- 为logstash输出的JSON格式的Appender -->
    <appender name="logstash"
              class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>10.1.56.75:4560</destination>
        <!-- 日志输出编码 -->
        <encoder
                class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
            <providers>
                <timestamp>
                    <timeZone>UTC</timeZone>
                </timestamp>
                <pattern>
                    <pattern>
                        {
                        "severity": "%level",
                        "service": "${springAppName:-}",
                        "port": "${serverPort:-}",
                        "trace": "%X{X-B3-TraceId:-}",
                        "span": "%X{X-B3-SpanId:-}",
                        "exportable": "%X{X-Span-Export:-}",
                        "pid": "${PID:-}",
                        "thread": "%thread",
                        "class": "%logger{40}",
                        "rest": "%message"
                        }
                    </pattern>
                </pattern>
            </providers>
        </encoder>
    </appender>

    <!-- 日志输出级别 -->
    <root level="INFO">
        <appender-ref ref="console"/>
        <appender-ref ref="logstash"/>
    </root>
</configuration>

编写一个Controller

@RestController
@Slf4j
public class ElkController {
    

    @RequestMapping("elk")
    public String testElk(String params) {
    

        log.info("接口入参 {}", params);

        params = "Hello World";

        log.error("error message {}", params);

        return params;
    }
}

我们访问一下这个ElkController并让日志打印到控制台:

这时我们去kibana配置索引信息,创建搜索规则就能将日志显示到Discover啦!

创建索引信息,这里的索引是我们当初配置logstash配置文件时候写好的

image-20200905145710709

点击create

image-20200905150230663 image-20200905150331417

到此我们ELK日志分析系统就已经搭建完成了,springboot日志也发到了日志系统中了;
springboot集成elk的demo地址:https://github.com/haoxiaoyong1014/springboot-examples/tree/master/springboot-elk

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/haoxiaoyong1014/article/details/108514391

智能推荐

bat 判断文件名字含有某些字段_一篇文章,学会jmeter模拟文件上传、下载操作-程序员宅基地

文章浏览阅读185次。最近很多同学都在问jmeter上传,下载文件的脚本怎么做?正巧这阵子忙完有时间,就来“折腾”一番,哈哈现整理出来和大家分享到底该怎么做?一、准备工作:上传接口一个(自行开发解决了)下载接口ps:没有困难创造困难也要上jmeter4.0版本上传接口源码/*** 文件上传*/@RequestMapping(value ="/fileUpload", method =..._bat 判断文件名包含

[转]NME Android目标中文输入问题完美解决!-程序员宅基地

文章浏览阅读117次。最近研究了一下haxe,发现蛮牛逼的,转几篇知识帖haXe开发笔记:中文问题的小结* .hx源文件中如果包含中文,要保存成UTF-8编码才能够正确被haXe编译器解析,是否包含BOM(Byte Order Marker, 在UTF-8文件中,为EF BB BF三个字节的固定值)无所谓。* 采用Assets.getText()是可以正确载入包含中文的文本文件的,前提是文本..._编程nme

手把手教你用springboot配置多数据源_spring boot多数据源-程序员宅基地

文章浏览阅读10w+次,点赞27次,收藏133次。1.文件结构:2.pom:<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://mave..._spring boot多数据源

ASP.NET C# List分页_asp.net takepage-程序员宅基地

文章浏览阅读1.2k次。List.Skip((pagecount-1)*pagesize).Take(pagesize)假设你每页10条数据当前是第3页 跳到第4页则:List.Skip((4-1)*10).Take(10)_asp.net takepage

ekho嵌入式Linux移植全过程-程序员宅基地

文章浏览阅读4.1k次。第一部分:背景说明:Ekho(余音)是一个把文字转换成声音的软件。它目前支持粤语、普通话(国语)、诏安客语、藏语、雅言(中国古代通用语)和韩语(试验中),英文则通过Festival间接实现。ekho的大致框架流程是1:读取文本字符2: 查字典匹配对应的音频信号数据3:将音频信号通过pulseaudio送入声卡发声。第二部分,配置,交叉编译相关依赖的关系ekho ----&..._ekho

github经典C++状态机(fsm)源代码剖析_c++状态机fsm源码剖析-程序员宅基地

文章浏览阅读9.7k次,点赞13次,收藏85次。在 github上有一个经典的状态机r-lyehv1.0.0,该状态机使用C++开发(支持C++11),单头文件,轻量级,跨平台,支持lambda表达式,使用非常方便,大大地简化了代码,使业务逻辑更清晰,是一个不错的fsm库,值得推荐。下载链接:下载下面对源该经典状态源代码以及示例以中文注释的方式进行剖析,以及大家更好地了解其原理及使用。//每个状态机都有'init', 'quit', 'push', 'back'四个成员成员函数//init:在创建某一状态时调用 ;quit在某一状态结束时.._c++状态机fsm源码剖析

随便推点

[Bug集合]fatal error: pcl/visualization/pcl_visualizer.h: No such file or directory-程序员宅基地

文章浏览阅读1.3w次,点赞9次,收藏41次。找到这篇文章的你一定是看了SLAM14讲第五章来的,我解决这个问题大概用了三天。。(小声bb:第五章根本用不上这个h文件,你注释掉就行)主流装PCL大概我总结了一下。可以看一下这里。出现这个bug有两种可能。1 .依赖缺少,在编译和安装时没有在urs/include/plcX.X目录下生成pcl_visualizer.h。先去这个目录下看一下是否是这种情况,如果没生成,请按照这..._fatal error: pcl/visualization/pcl_visualizer.h: no such file or directory

dispatch_group_enter、 dispatch_group_leave和dispatch_group_wait来实现同步_dispatch_group_enter dispatch_group_leave dispatch-程序员宅基地

文章浏览阅读7.2k次。dispatch_group_t group = dispatch_group_create();MyCoreDataObject *coreDataObject;dispatch_group_enter(group);AFHTTPRequestOperation *operation1 = [[AFHTTPRequestOperation alloc] initWithRequest:_dispatch_group_enter dispatch_group_leave dispatch_group_wait

maven中的打包插件_maven 中的打包插件-程序员宅基地

文章浏览阅读276次。1、maven-compiler-plugin用于编译Maven项目的Java源代码 生成jar文件参看:https://blog.csdn.net/taiyangdao/article/details/512591822、其他插件:参看:https://blog.csdn.net/johnnywww/article/details/7964326..._maven 中的打包插件

组态王打包程序_组态王打包成exe程序-程序员宅基地

文章浏览阅读9.5k次,点赞3次,收藏14次。1、将要打包的项目设为当前工程2、开始 —> 组态王6.55 —>工程打包工具。3、在弹出的窗口中,找到组态王安装路径Kingview文件夹中的KVPacket.Prj文件,单机选中,之后点击打开。4、而后跳出的生成路径,无所谓,自己是设定好了,如:D:\chenzhutaibuild,建议放在D盘,别问为什么,哈哈5、如果需要添加相应的读写文件等其它高级操作,则接着点击上图中的“高级”按钮6、这里暂时不需要,所以直接点击生成按钮7、..._组态王打包成exe程序

Python脚本在Windows下后台运行_python 可以实现window系统下 进程挂起吗-程序员宅基地

文章浏览阅读1.5w次。Python脚本在Linux后台执行加个&就行了在Windows起Python服务总有不畅查了一下,可以用start /b python xxx.py后台运行,这招虽然不影响cmd操作,但是关闭cmd窗口后服务也死了解决这个问题挺麻烦的,需要以Windows服务的方式挂起来第一步,将Python脚本打包成exe可执行文件,详见: 用python_python 可以实现window系统下 进程挂起吗

解决 “MoveFile”: 类型库“XXX.dll”中的标识符已经是宏;使用“rename”限定符 类型库符号与系统符号冲突问题_类型库中的标识符已经是宏;使用“rename”限定符-程序员宅基地

文章浏览阅读667次。今天在VS工程当中引入一个组件,编译的时候出现警告, “MoveFile”: 类型库“XXX.dll”中的标识符已经是宏;使用“rename”限定符。虽然只是一个警告,但看着实在不爽,更重要的是,警告在某些情况下,可能正是bug的来源,并且这类bug往往非常难以定位。废话不多话,下面来解决问题。 看编译器给出的提示,是告诉我们,类型库当中的符号和系统符号有重名,同时也给出了解决方法,就是..._类型库中的标识符已经是宏;使用“rename”限定符

推荐文章

热门文章

相关标签