1.springboot安装及配置?
2.一次Kafka集群宕机的源码问题排查记录
3.Filebeat的架构分析、配置解释与示例
4.七、下载Docker常用安装
springboot安装及配置?
SpringBoot教程第篇:整合elk,源码搭建实时日志平台
这篇文章主要介绍springboot整合elk.
elk简介
elk下载安装
elk下载地址:
建议在linux上运行,下载elk在windows上支持得不好,源码另外需要jdk1.8的下载直播系统开发源码支持,需要提前安装好jdk.
下载完之后:安装,源码以logstash为栗子:
配置、下载启动Elasticsearch
打开Elasticsearch的源码配置文件:
修改配置:
network.host=localhost
network.port=
它默认就是这个配置,没有特殊要求,下载在本地不需要修改。源码
启动Elasticsearch
启动成功,下载访问localhost:,源码网页显示:
配置、启动logstash
在logstash的下载主目录下:
修改log4j_to_es.conf如下:
input{
log4j{
mode="server"
host="localhost"
port=
}
}
filter{
#Onlymatcheddataaresendtooutput.
}
output{
elasticsearch{
action="index"#TheoperationonES
hosts="localhost:"#ElasticSearchhost,canbearray.
index="applog"#Theindextowritedatato.
}
}
修改完配置后启动:
./bin/logstash-fconfig/log4j_to_es.conf
终端显示如下:
访问localhost:
证明logstash启动成功。
配置、源码启动kibana
到kibana的安装目录:
默认配置即可。
访问localhost:,网页显示:
证明启动成功。
创建springboot工程
起步依赖如下:
log4j的配置,/src/resources/log4j.properties如下:
log4j.rootLogger=INFO,console
#forpackagecom.demo.elk,logwouldbesenttosocketappender.
log4j.logger.com.forezp=DEBUG,socket
#appendersocket
log4j.appender.socket=org.apache.log4j.net.SocketAppender
log4j.appender.socket.Port=
log4j.appender.socket.RemoteHost=localhost
log4j.appender.socket.layout=org.apache.log4j.PatternLayout
log4j.appender.socket.layout.ConversionPattern=%d[%-5p][%l]%m%n
log4j.appender.socket.ReconnectionDelay=
#appenderconsole
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d[%-5p][%l]%m%n
打印log测试:
在kibana实时监控日志
打开localhost::
Management=indexpattrns=addnew:
点击discovery:
springboot配置文件总结
springboot本身支持多种灵活的配置方式,为开发springboot程序带来了很大的灵活性和扩展性,但是同时由于太灵活,经常会导致明明配置了相关属性,却没有生效。
本文总结了springboot配置文件的原理以及多个配置文件生效的顺序。
springboot配置文件支持灵活的路径,以及灵活的文件名,用一个变量表达式总结如下:
部分源码如下:
当满足上述变量表达式的配置文件有多个时,会有一个配置的优先级。假设
上面每个条件组合起来,则最多有配置文件如下,且顺序从上到下:
获取属性时,按从上到下的顺序遍历由上述文件生成的属性资源对象PropertySource,如果遇到匹配的key直接返回。
总结一下:就是如果同一个key的属性只出现一次,则直接取该值即可。如果同一个key的属性出现多次,则取顺序靠前的tostring源码属性资源对象。另外其中每个文件都是可选的。
需要注意的一点是:如果在同一个location下配置了多个文件名一样的文件,则只会取一个,比如在classpath:/,有如下两个文件application.yml:
则只会根据classloader的classpath列表,选取第一个出现的文件。因为springboot加载配置文件时最底层是使用的下面的方法:
这两个方法只会获取classloader类的ucp属性里面第一个匹配到的值。如果对springboot自身的机制不满意,想获取所有的classpath:/路径下面的applicaiton.yml文件,可以使用下面的方法:
本文总结了springboot配置文件的原理以及多个配置文件生效的顺序。如果存在增加了配置文件或者在配置文件里面增加了属性却没有生效,可以参考上面的springboot配置文件表达式和配置文件生效顺序进行排查。
后面还会有一篇文章讨论基于springboot配置原理如何实现自定义的配置读取方式。
springboot插件安装(JBLSpringBootAppGen)插件安装
在应用springboot工程的时候;一般情况下都需要创建启动引导类Application.java和application.yml配置文件,而且内容都是一样的;为了便捷可以安装一个IDEA的插件JBLSpringBootAppGen在项目上右击之后可以自动生成启动引导类Application.java和application.yml配置文件。
使用
新建任意一个maven工程,右击工程,选择JBLSpringBootAppGen
是否添加application.properties文件
点击OK,工具会自动帮忙创建
SpringBoot配置文件详解(告别XML)快速学会和掌握SpringBoot的核心配置文件的使用。
SpringBoot提供了丰富的外部配置,常见的有:
其中核心配置文件我们并不陌生,主要以Key-Value的形式进行配置,其中属性Key主要分为两种:
在application.properties添加配置如下:
①添加数据源信息
在application.propertis添加配置如下:
①添加认证信息,其中socks.indentity.*是自定义的属性前缀。
②添加随机值,其中spring.test.*是自定义的属性前缀。
使用方法:@ConfigurationProperties(prefix="spring.datasource")
使用说明:提供Setter方法和标记组件Component
如何验证是否成功读取配置?答:这里可以简单做个验证,注入MyDataSource,使用Debug模式可以看到如下信息:
使用方法:@Value("spring.datasource.*")
使用说明:提供Setter方法和标记组件Component
注意事项:@Value不支持注入静态变量,可间接通过Setter注入来实现。
关于两者的简单功能对比:
显然,前者支持松绑定的特性更强大,所以在实际开发中建议使用@ConfigurationProperties来读取自定义属性。
SpringBoot默认会加载这些路径加载核心配置文件,按优先级从高到低进行排列:具体规则详见ConfigFileApplicationListener
如果存在多个配置文件,则严格按照优先级进行覆盖,最高者胜出:
举个简单的azureus 源码例子,例如再上述位置都有一个application.properties,并且每个文件都写入了server.port=xx(xx分别是,,,),在启动成功之后,最终应用的端口为:。图例:
如果想修改默认的加载路径或者调改默认的配置文件名,我们可以借助命令行参数进行指定,例如:
YAML是JSON的一个超集,是一种可轻松定义层次结构的数据格式。
答:因为配置文件这东西,结构化越早接触越规范越好。这里推荐阅读阮一峰老师写的YAML语言教程,写的很简单明了。
引入依赖:在POM文件引入snakeyaml的依赖。
使用说明:直接在类路径添加application.yml即可。
例如下面这两段配置是完全等价的:
①在application.yml配置数据源:
②在application.properties配置数据源:
在项目的实际开发中,我们往往需要根据不同的环境来加载不同的配置文件。例如生产环境,测试环境和开发环境等。此时,我们可以借助Profiles来指定加载哪些配置文件。例如:
温馨提示:如果spring.profiles.active指定了多个配置文件,则按顺序加载,其中最后的优先级最高,也就是最后的会覆盖前者。
使用方法:
使用Maven插件打包好项目,然后在当前路径,执行DOS命令:java-jardemo.jar--server.port=,在控制台可看到应用端口变成了。
实现原理:
默认情况下,SpringBoot会将这些命令行参数转化成一个Property,并将其添加到Environment上下文。
温馨提示:
由于命令行参数优先级非常之高,基本高于所有常见的外部配置,所以使用的mencoder 源码时候要谨慎。详见PropertySource执行顺序。
关闭方法:
如果想禁用命令行属性,可以设置如下操作:springApplication.setAddCommandLineProperties(false)
Springboot配置logback因为logback其他配置尚好理解,本文只说明比较少用,但是却起关键作用的两个子节点。
1、依赖:
实际开发中我们不需要直接添加该依赖,你会发现spring-boot-starter其中包含了spring-boot-starter-logging,SpringBoot为我们提供了很多默认的日志配置,所以,只要将spring-boot-starter-logging作为依赖加入到当前应用的classpath,则“开箱即用”。
2、日记的等级
日志级别从低到高分为TRACEDEBUGINFOWARNERRORFATAL
3、配置
这里对日志框架的支持有两种配置方式,一般来讲我们倘若不是要较复杂的需求,可以直接在?application.yml?配置文件配置下即可:
application.properties或?application.yml?(系统层面)
参考网站:
logback-spring.xml?(自定义文件方式)
参考网站:
4、彩色打印
参考:
5、@Slf4j注解
安装lombok插件,在需要打印的类名上加上该注解即可
替代下面语句的编写
privateLoggerlogger=LoggerFactory.getLogger(this.getClass());
6、打印不出json的问题
不是打印不出而是正确的要加一个占位符{ },如下
log.info("hospital{ }",JSON.toJSONString(hospitalEntity2));
7、log存放文件路径定义
最关键的两个节点,你可以理解之前的property、appender嵌套property只是一些定义好的变量,真正定义方法怎么去运用这些变量是这两个节点所要做的。
1、子节点--root
root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性,不区分大小写,默认是DEBUG。
可以包含零个或多个元素,标识这个appender将会添加到这个loger(理解root为一个全局的loger)。
举例子:
上图这是我定义好的文件输出的appender节点,对应下图的appender-ref节点,ref对应appender的layoutit 源码name属性,上面说到root节点好比一个方法,所以现在这个方法的意思是全局打印等级为INFO,而且四个appender变量都执行,即正常的控制台输出和warn、info、error的三个文件输出,可以到对应的控制台和日志文件里面看到的确有日志。反之倘若我们level定为Debug,或者去除name为“WARN”的appender则是输出Debug以上等级的日志,WARN.log日志文件也不会再有日志打印进去。
2、子节点--loger
loger用来设置某一个包或者具体的某一个类的日志打印级别、以及指定appender,也就是只管辖指定的区域的日志输出规则。loger仅有一个name属性,一个可选的level和一个可选的addtivity属性。
注意:这里说的上级就是root节点
name:用来指定受此loger约束的某一个包或者具体的某一个类。
level:用来设置打印级别,大小写无关:TRACE,DEBUG,INFO,WARN,ERROR,ALL和OFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。如果未设置此属性,那么当前loger将会继承上级的级别。
addtivity:是否向上级loger传递打印信息。默认是true。
举例子:
控制com.dudu.controller.LearnController类的日志打印,打印级别为“WARN”;
additivity属性为false,表示此loger的打印信息不再向上级传递;
指定了名字为“console”的appender;
这时候执行com.dudu.controller.LearnController类的login方法时,先执行loggername="com.dudu.controller.LearnController"level="WARN"additivity="false",
将级别为“WARN”及大于“WARN”的日志信息交给此loger指定的名为“console”的appender处理,在控制台中打出日志,不再向上级root传递打印信息。
注意:
当然如果你把additivity=”false”改成additivity=”true”的话,就会打印两次,因为打印信息向上级传递,logger本身打印一次,root接到后又打印一次。
四、配合多环境
据不同环境(prod:生产环境,test:测试环境,dev:开发环境)来定义不同的日志输出,在logback-spring.xml中使用springProfile节点来定义,方法如下:
文件名称不是logback.xml,想使用spring扩展profile支持,要以logback-spring.xml命名
可以启动服务的时候指定profile(如不指定使用默认),如指定prod的方式为:
java-jarxxx.jar–spring.profiles.active=prod
关于多环境配置可以参考
SpringBoot干货系列:(二)配置文件解析
一次Kafka集群宕机的问题排查记录
大家好,我是方木
某机房ELK集群索引出现延迟,上班后接到报警,开始排查问题。
机房Kafka集群服务和zookeeper服务分离,早7点,某个索引停止索引,推测logstash indexer生成日志异常,重启索引点logstash indexer,未恢复。查看Kafka服务器上分片数据,Broker 0的物理log文件最后修改时间停留在早7点,疑似Kafka问题。
监控显示Broker 0网卡入出带宽几乎降至0,而Broker 1和Broker 2虽有下降,但未至0,解释了部分索引仍正常现象。查看日志,Broker 0出现日志异常,Broker 1和Broker 2报java.io.IOException,推测Kafka集群间状态异常,导致Broker 0被集群剔除。
通过Kafka源码分析,确认异常情况发生在断开连接时。重启Broker 0 Kafka服务,大部分索引恢复,后续分别重启Broker 1和Broker 2,所有索引恢复正常。
事后发现部分服务器性能指标异常。几年前曾因logstash shipper bug导致类似问题,通过升级版本解决。本次close wait升高,疑为网络波动或Kafka版本问题。如果问题频繁出现,考虑升级kafka版本。
Filebeat的架构分析、配置解释与示例
在了解 Filebeat 的架构分析、配置解释与示例之前,我们需要先对 Beats 平台有个基本认知。Beats 平台是由 Elastic.co 从 packetbeat 发展而来,是数据收集器系统。其中,libbeat 提供了统一的数据发送方法、输入配置解析、日志记录框架等核心功能,使得所有 Beat 工具在配置上除了 input 之外,其他如 output、filter、shipper、logging、run-options 等配置规则保持一致。Filebeat 正是 Beats 家族的一员,目前支持将数据发送至 Elasticsearch、Logstash、File、Console 等四个目标地址。其基础是 logstash-forwarder 源码的改造,成为 ELK Stack 在 shipper 端的首选工具。
架构设计方面,Filebeat 在安装后,会在安装目录下发现两个关键文件,其整体架构围绕日志收集与处理进行设计。用户通过配置 filebeat.yml 文件来指定监听的日志文件目录,即prospectors中设置的日志文件路径。Filebeat 启动后,harvester 进程负责读取指定目录中的新日志内容,这些内容随后被发送至 spooler(后台处理程序)进行收集和聚合,最终根据配置发送至指定输出端。
为了开始使用 Filebeat,用户需完成相关产品的安装与配置。具体操作包括但不限于 Linux 环境下的部署、配置调整等。以下为不同操作系统下安装 Filebeat 的方法:
- **deb**:通过 curl 命令下载安装包,执行 `sudo dpkg -i filebeat_1.3.1_amd.deb` 进行安装。
- **rpm**:同样使用 curl 命令获取 rpm 包,执行 `sudo rpm -vi filebeat-1.0.1-x_.rpm` 完成安装。
- **mac**:下载 tgz 包,使用 `tar xzvf filebeat-1.3.1-darwin.tgz` 解压并安装。
- **win**:获取安装包后,执行相应的安装步骤即可。
配置解析部分,Filebeat 提供了四种主要的输出方式:Elasticsearch、Logstash、File、以及 Console。以下将通过示例具体展示配置与运行效果:
- **输出至 Elasticsearch**:在 filebeat.yml 中,通过注释其他输出方式来配置 Elasticsearch 输出。添加日志后,使用 Elasticsearch 进行检索验证效果。
- **输出至 Logstash**:调整配置文件,通过编写 Logstash 配置文件与启动 Logstash 服务,实现日志数据的 Logstash 输出。添加日志后,使用 Logstash 的特性记录 beat 名和 type 名,并验证输出效果。
- **输出至 File**:注释除 file 输出方式外的其他输出配置,添加日志后,观察文件中是否正确记录了日志内容。
- **输出至 Console**:调整配置后,重启服务,通过在终端中查看输出效果来验证 Console 输出功能。
通过 ELK+Filebeat 的集成应用,可以实现日志数据的有效收集与分析。示例演示了在 /opt/elk/log 目录下设置多个日志文件,通过 Python 脚本向这些文件追加内容,配置 Filebeat 输出为 Logstash,并启动相关服务,最终通过 Web 查看结果。这类集成应用为日志分析提供了强大而灵活的工具。
对于配置理解与解释,推荐阅读相关文章,如《ELK beats通用配置说明(th)》等,以获得更深入、详细的配置指南与示例。这些资源通常由技术社区或专业开发者撰写,提供了从基础配置到高级应用的全面指导。
七、Docker常用安装
安装Docker的总体步骤包括安装并配置常用软件如Tomcat、Nginx、MySQL、Redis、RabbitMQ、.NetCore项目、ELK、Consul、RocketMQ、Nacos及Sentry。具体操作如下:
在安装Tomcat时,若计划将项目部署至根目录,需在tomcat文件夹创建ROOT文件夹,并将项目文件拷贝至其中。
安装并配置Nginx以实现负载均衡,通过编辑nginx.conf文件,添加对应web应用的IP地址和端口号,并配置proxy_pass以指向upstream的名称。
安装MySQL,通过特定命令映射端口、指定服务名称、挂载配置文件和日志目录,并初始化root用户密码。运行命令后,登录MySQL并展示数据库。
安装Redis5.1,使用redis-cli连接Redis,并通过客户端工具配置redis。
安装并部署.RocketMQ项目,使用Dockerfile创建并运行镜像,注意正确使用端口映射和命名。
部署.NetCore项目,通过Dockerfile构建并运行镜像,确保数据库连接字符串使用宿主机IP。
安装并配置ELK系统,使用Elasticsearch、Logstash和Kibana三个组件进行日志收集、处理和可视化。确保所有组件版本一致,并根据配置文件进行相应设置。
安装Consul,通过拉取镜像并启动,访问其管理页面进行管理。
安装RocketMQ,使用Docker-Compose环境搭建,配置docker-compose.yml文件以运行broker服务,并使用本机IP作为brokerIP。
安装Nacos,通过访问其管理界面进行管理,使用默认登录账号和密码。
安装Sentry,使用git下载源码进行安装,若忘记DSN,可通过项目设置找到。