统一日志管理方案:Spring项目logback日志与logstash和Elasticsearch整合

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
Elasticsearch Serverless通用抵扣包,测试体验金 200元
简介: 统一日志管理方案:Spring项目logback日志与logstash和Elasticsearch整合。

原创/朱季谦

 

最近在做一个将分布式系统的日志数据通过logstash传到kafka的功能,做完之后决定业余搭一个ELK日志分析系统,将logstash采集到的日志传给Elasticsearch。经过一番捣鼓,也把这个过程给走通了,于是写了这篇总结,可按照以下步骤搭建logstash采集spring日志数据并传输给Elasticsearch。

 

首先,logstash是一个开源的数据收集引擎,能够同时从多个来源采集到数据,并将数据转发到想存储的“库”中。例如,logstash可以采集数据转发存储到Elasticsearch,也可以转发到kafka等消息中间件里。logstash拥有强大的插件生态,包括基本的http、tcp、udp、file以及kafa、redis等等。这些插件,在logstash5.x版本以上的,是已经自带了,不需要额外安装。

 

在基于ssm的开发过程中,运行Spring项目时,可以在控制台上看到log的日志打印信息,我们可以把这些日志信息的ERROR日志进行监听和转发存储。

如何实现logstash来监听Spring项目的日志并将ERROR数据进行转发存储呢?

部署架构图:

 

本地验证环境:win10,Spring+Mybatis+logback.xml

 

 

可以按照以下流程来实现:

1.下载logstash。

根据以下地址来网盘获取logstash-5.5.2版本的:

链接:https://pan.baidu.com/s/1h7xo65P7_O76Azt0-I-2-A

提取码:95vg

还可以官网下载:https://www.elastic.co/cn/downloads/logstash

2.安装logstash

直接把压缩包压缩到本地某个盘里就可以了,不需要做额外操作了,5.x以上版本的logstash是不需要安装其他插件,已经自带大部分插件。

3.验证是否安装成功

运行cmd,进入logstash的bin目录下,运行指令:logstash -e 'input{stdin{}} output{stdout{}}'

运行成功的截图如下,即为安装并启动成功:

 

启动以后,在光标处输入:hellowrold

正常情况下,会显示以下信息,证明logstash可以正常使用了。

在这个过程里,涉及到几个概念,logstash是一个管道,里面有两个input和output的必选元素,即输入与输出,之间还可以有一个可选的过滤器filter过滤器。input插件从源头获取到数据,过滤器会根据条件来进行修改,最后通过ouput插件将数据传输,可输出给Elasticsearch、kafka、file

等。

处理过程模型图如下:

Logstash 提供了一个 shell 脚本叫 logstash,支持以下运行参数:

执行命令: -e 执行-e后面的参数:logstash -e 'input{stdin{}} output{stdout{}}'

执行文件: --config 或 -f 执行-f后面的conf文件:logstash -f logstash.conf

输入插件:input{ … }

过滤插件:filter{ … }

输出插件:output{ … }

测试配置文件是否正确,然后退出:-t

在这篇文章里,主要用到以上这些命令,其余读者若感兴趣可以自行去研究探索。

 

4.配置一个文件**.conf

可以在bin目录或者config目录或者其他目录下,新建一个**.conf文件,我选择的是bin目录下,新建文件logstash.conf,截图如下:

在logstash.conf文件里配置信息:

 input { stdin {}}#该行可有可无,写来打印测试而已
  input {#开启tcp插件的监听      tcp {#这个需要配置成本机IP,不然logstash无法启动      host => "127.0.0.1"#端口号      port => 9600
#将日志以json格式输入     codec => json_lines
}} output {#输出打印     stdout { codec => rubydebug }}

配置好,就可以先启动进行监听了,启动命令:先cd进到存放logstash.conf的目录下,我的目录在bin里,所以进入的是bin目录,执行:logstash -f logstash.conf。

5.在spring进行logstash配置的maven依赖引入

我在项目里用到的开源日志组件是logback它是log4j的改良,主要分为以下三个模块:

logback-classic:log4j的一个改良版本,完整实现了slf4j API,可以方便更换成其它日志系统如log4j或JDK14 Logging。

logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能。

logback-core:是其它两个模块的基础模块。

logback需要在maven里引用到的依赖:

<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId><version>1.2.3</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-access</artifactId><version>1.2.3</version></dependency><dependency><groupId>net.logstash.log4j</groupId><artifactId>jsonevent-layout</artifactId><version>1.6</version></dependency><dependency><groupId>net.logstash.logback</groupId><artifactId>logstash-logback-encoder</artifactId><version>5.0</version></dependency>

如果引用到的ch.qos.logback依赖版本太低的话,可能会出现以下错误:java.lang.NoSuchMethodError: ch.qos.logback.core.util.Loader.getResourceOccurrenceCount(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljava/util/Set;可以根据项目需求来选择合适的版本,经过测试,以上的1.2.3版本是可以符合要求的。配置完成依赖后,就可以开始进行下一步配置。

6.在spring的logback.xml里进行logstash配置(省略logback其余无关该流程的部分)

<!--开启tcp格式的logstash传输,通过TCP协议连接Logstash--><appendername="STASH"class="net.logstash.logback.appender.LogstashTcpSocketAppender"><destination>127.0.0.1:9600</destination><encoderclass="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"><jsonFactoryDecoratorclass="net.logstash.logback.decorate.CharacterEscapesJsonFactoryDecorator"><escape><targetCharacterCode>10</targetCharacterCode><escapeSequence>\u2028</escapeSequence></escape></jsonFactoryDecorator><providers><pattern><pattern>                     {
                     "timestamp":"%date{ISO8601}",
                     "user":"test",
                     "message":"[%d{yyyy-MM-dd HH:mm:ss.SSS}][%p][%t][%l{80}|%L]%m"}%n
                     }
</pattern></pattern></providers></encoder><keepAliveDuration>5 minutes</keepAliveDuration></appender><rootlevel="INFO"><appender-refref="STASH"/></root>

配置说明:

encoder:配置的规范;

LoggingEventCompositeJsonEncoder:json格式的编码器,即将日志数据转换成json格式;

jsonFactoryDecorator:解决中文转码的问题;

providers:json格式提供者,对json进行一个定制化设置,比如,timestamp,message,thread_name等,其他的自定义的字段的值可以通过MDC设置进来,格式就是%date{xx},

注意:按照上面的设置,logstash才可以正常接收到日志数据,否则是无法接收到的。

destination定义的ip与端口与logstash里的logstash.conf需一直,logstash.conf里的tcp会一直监听这个ip的端口:

配置完成后,启动spring项目,这时原来监听tcp的logstash就可以实时监听接收到了数据,logstash的控制台显示打印如下:

若要监听到的是ERROR级别的日志,在logback.xml里的logstash配置里的appender里添加一行以下代码即可:

<filterclass="ch.qos.logback.classic.filter.ThresholdFilter"><level>ERROR</level></filter>

在日志级别修改为以下即可:

<rootlevel="INFO"><appender-refref="STASH"/><appender-refref="ERROR"/></root>

7.到这一步,就完成了通过logstash收集spring的logback日志的功能,在这个基础上,可以再进一步扩展,扩展将logstash采集到的数据输出到Elasticsearch。

  input { stdin { } }#该行可有可无
   input {
       #开启tcp模式的监听
       tcp {
       #这个需要配置成本机IP,不然logstash无法启动
       host => "127.0.0.1"
       #端口号
       port => 9600
       #将日志以json格式输入
      codec => json_lines
     }
 }
 output {
     #输出打印
     stdout { codec => rubydebug } 
     elasticsearch { hosts => ["127.0.0.1:9200"] }
 }

打开已经本地安装的Elasticsearch:http://127.0.0.1:9100/,可以看到,ES可以接受到logstash接收到的数据了:

同理,可根据以上方案在分布式架构环境当中,集成各个模块的日志,统一推送到Elasticsearch里。

目录
相关文章
|
1月前
|
Prometheus 监控 Java
日志收集和Spring 微服务监控的最佳实践
在微服务架构中,日志记录与监控对系统稳定性、问题排查和性能优化至关重要。本文介绍了在 Spring 微服务中实现高效日志记录与监控的最佳实践,涵盖日志级别选择、结构化日志、集中记录、服务ID跟踪、上下文信息添加、日志轮转,以及使用 Spring Boot Actuator、Micrometer、Prometheus、Grafana、ELK 堆栈等工具进行监控与可视化。通过这些方法,可提升系统的可观测性与运维效率。
175 1
日志收集和Spring 微服务监控的最佳实践
|
1月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
309 4
|
6月前
|
前端开发 安全 Java
Spring Boot 便利店销售系统项目分包设计解析
本文深入解析了基于Spring Boot的便利店销售系统分包设计,通过清晰的分层架构(表现层、业务逻辑层、数据访问层等)和模块化设计,提升了代码的可维护性、复用性和扩展性。具体分包结构包括`controller`、`service`、`repository`、`entity`、`dto`、`config`和`util`等模块,职责分明,便于团队协作与功能迭代。该设计为复杂企业级应用开发提供了实践参考。
246 0
|
3月前
|
机器学习/深度学习 XML Java
【spring boot logback】日志logback格式解析
在 Spring Boot 中,Logback 是默认的日志框架,它支持灵活的日志格式配置。通过配置 logback.xml 文件,可以定义日志的输出格式、日志级别、日志文件路径等。
574 5
|
3月前
|
Java 关系型数据库 数据库连接
Spring Boot项目集成MyBatis Plus操作PostgreSQL全解析
集成 Spring Boot、PostgreSQL 和 MyBatis Plus 的步骤与 MyBatis 类似,只不过在 MyBatis Plus 中提供了更多的便利功能,如自动生成 SQL、分页查询、Wrapper 查询等。
309 3
|
5月前
|
监控 容灾 算法
阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化
本文探讨了如何高效、经济且可靠地将海外应用与基础设施日志统一采集至阿里云日志服务(SLS),解决全球化业务扩展中的关键挑战。重点介绍了高性能日志采集Agent(iLogtail/LoongCollector)在海外场景的应用,推荐使用LoongCollector以获得更优的稳定性和网络容错能力。同时分析了多种网络接入方案,包括公网直连、全球加速优化、阿里云内网及专线/CEN/VPN接入等,并提供了成本优化策略和多目标发送配置指导,帮助企业构建稳定、低成本、高可用的全球日志系统。
672 54
|
3月前
|
Java 测试技术 Spring
简单学Spring Boot | 博客项目的测试
本内容介绍了基于Spring Boot的博客项目测试实践,重点在于通过测试驱动开发(TDD)优化服务层代码,提升代码质量和功能可靠性。案例详细展示了如何为PostService类编写测试用例、运行测试并根据反馈优化功能代码,包括两次优化过程。通过TDD流程,确保每项功能经过严格验证,增强代码可维护性与系统稳定性。
173 0
|
3月前
|
存储 Java 数据库连接
简单学Spring Boot | 博客项目的三层架构重构
本案例通过采用三层架构(数据访问层、业务逻辑层、表现层)重构项目,解决了集中式开发导致的代码臃肿问题。各层职责清晰,结合依赖注入实现解耦,提升了系统的可维护性、可测试性和可扩展性,为后续接入真实数据库奠定基础。
315 0