使用Spring Boot和Logback登录到Redis

在进行集中式日志记录时,例如使用Elasticsearch,Logstash和Kibana或Graylog2,您可以为Java应用程序提供几个选项。 您既可以编写标准的应用程序日志,也可以使用Logstash解析这些日志,这些日志既可以直接使用,也可以使用logstash-forwarder运送到另一台计算机。 另外,您可以直接以更合适的格式(如JSON)编写,因此处理步骤不需要太多的工作来解析消息。 第三种选择是直接写入不同的数据存储,该存储充当日志消息的缓冲区。 在本文中,我们正在研究如何在Spring Boot应用程序中配置Logback以将日志消息直接写入Redis 。

概述-redis-logstash

雷迪斯

我们正在使用Redis作为消息的日志缓冲区。 不是每个人都对Redis感到满意,但这是一个常见的选择。 Redis将其内容存储在内存中,使其非常适合快速访问,但也可以在必要时将其同步到光盘。 Redis的一个特殊功能是值可以是不同的数据类型,例如字符串,列表或集合。 我们的应用程序使用单个键和值对,其中键是应用程序的名称,值是包含我们所有日志消息的列表。 这样,我们可以在一个Redis实例中处理多个日志应用程序。

在测试设置时,您可能还需要调查Redis中存储的数据。 您可以使用redis-cli client访问它。 我收集了一些有用的命令来验证您的日志消息是否实际上已写入Redis。

命令 描述
KEYS * 显示此Redis实例中的所有键
LLEN key 显示key列表中的消息数
LRANGE key 0 100 显示key列表中的前100条消息

登录配置

大多数情况下,使用Logback时,所有配置都使用XML文件。 Appender是将日志输出发送到某处的东西。 记录器用于设置日志级别,并将附加器附加到应用程序的某些部分。

对于Spring Boot,Logback可用于使用spring-boot-starter-logging的任何应用程序,它也是常见spring-boot-starter-web的依赖项。 可以将配置添加到位于src/main/resources名为logback.xml的文件中。

Spring Boot随附了已正确配置的文件和控制台附加程序。 我们可以在文件中包括基本配置,以保留所有预定义的配置。

为了登录到Redis,我们需要添加另一个appender。 一个不错的选择是相当轻巧的logback-redis-appender ,它使用Java客户端Jedis。 日志消息直接以JSON格式写入Redis,因此它非常适合logstash之类。 我们可以使用以下配置将Spring Boot日志记录到Redis的本地实例。

<?xml version="1.0" encoding="UTF-8"?>
<configuration><include resource="org/springframework/boot/logging/logback/base.xml"/><appender name="LOGSTASH" class="com.cwbase.logback.RedisAppender"><host>localhost</host><port>6379</port><key>my-spring-boot-app</key></appender><root level="INFO"><appender-ref ref="LOGSTASH" /><appender-ref ref="CONSOLE" /><appender-ref ref="FILE" /></root>
</configuration>

我们配置一个appender命名LOGSTASH那就是一个实例RedisAppender 。 为本地Redis实例设置了主机和端口,键标识用于日志的Redis键。 还有更多可用选项,例如将日志消息推送到Redis的时间间隔。 浏览该项目的自述文件以获取更多信息。

Spring Boot依赖关系

为了使日志记录正常工作,我们当然必须为pom添加logback-redis-appender依赖项。 根据您的Spring Boot版本,您可能会在日志文件中看到一些缺少方法的错误。

这是因为Spring Boot 管理其内部使用的依赖项,而jedis和commons-pool2的版本与我们需要的依赖项不匹配。 如果发生这种情况,我们可以配置要在pom的properties部分中使用的版本。

<properties><commons-pool2.version>2.0</commons-pool2.version><jedis.version>2.5.2</jedis.version>
</properties>

现在,该应用程序将启动,您可以看到它也将日志消息发送到Redis。

加强配置

最好不要在logback.xml配置主机和端口。 当部署到具有不同设置的另一环境时,您必须更改文件或部署自定义文件。

Logback的Spring Boot集成允许使用主配置文件application.properties来设置一些配置选项,例如要登录的文件和日志级别。 不幸的是,这是对某些值的一种特殊处理,就我所知,您无法添加自定义值。

但是幸运的是,Logback支持使用环境变量,因此我们不必依赖配置文件。 设置了环境变量REDIS_HOSTREDIS_PORT您可以对附加程序使用以下配置。

<appender name="LOGSTASH" class="com.cwbase.logback.RedisAppender"><host>${REDIS_HOST}</host><port>${REDIS_PORT}</port><key>my-spring-boot-app</key></appender>

我们甚至可以更进一步。 要仅在设置了属性时激活附加程序,可以将条件处理添加到配置中。

<if condition='isDefined("REDIS_HOST") && isDefined("REDIS_PORT")'><then><appender name="LOGSTASH" class="com.cwbase.logback.RedisAppender"><host>${REDIS_HOST}</host><port>${REDIS_PORT}</port><key>my-spring-boot-app</key></appender></then></if>

您可以使用Java表达式来确定是否应评估该块。 当附加器不可用时,Logback将仅记录错误并使用配置的任何其他附加器。 为此,您需要将Janino库添加到pom中 。

现在,根据环境变量激活了附加程序。 如果愿意,可以跳过本地开发的设置,而仅在生产系统上设置变量。

结论

轻松启动Spring Boot或仅登录Redis都很容易,但是其中一些细节是正确的工作。 但这值得付出努力:一旦习惯了集中式日志记录,就不再需要没有它的系统。

翻译自: https://www.javacodegeeks.com/2015/01/logging-to-redis-using-spring-boot-and-logback.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360991.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《CSS世界》学习笔记(一)

《CSS世界》&#xff0c;张鑫旭著&#xff0c;人民邮电出版社&#xff0c;2017年12月第一版。 1.P9二维码链接文章的demo值得一看&#xff0c;可以实现有关“某些区域颜色始终保持一致”的效果。 P9二维码所链接文章的一个demo里&#xff0c;图标用i标签 背景图的形式实现。我…

Tautology(poj3295)(DFS)

本题中最多5个命题变项&#xff1a;p,q,r,s,t 每个有0,1两种取值&#xff0c;所以总共32种情况&#xff0c;分别枚举即可。 对于每种情况&#xff0c;计算表达式的值&#xff0c;如果有结果为0的则输出not 难点在于如何计算表达式的值&#xff0c;我们采用递归的方法&#xff0…

Spring重试–与项目集成的方式

如果您需要在代码中实现健壮的重试逻辑&#xff0c;一种行之有效的方法是使用spring重试库。 我的目的不是要展示如何使用spring retry项目本身&#xff0c;而是要展示可以将其集成到代码库中的不同方式。 考虑一种服务来调用外部系统&#xff1a; package retry.service;pub…

(1)《Head First HTML与CSS》学习笔记---HTML基本概念

前言&#xff1a; 1. 这本书并没有面面俱到&#xff0c;涵盖所有内容&#xff0c;只提供作为初学者真正需要的东西&#xff1a;基本知识和信心。所以这不是唯一的参考书。&#xff08;我买了一本《HTML5权威指南》作为参考书和这本一起看&#xff0c;但还是以本书为第一个…

mac中如何从vim文本编辑器退回到命令

有的时候&#xff0c;我们经常从命令行中进入vim文本编辑器&#xff0c;如何退回来呢&#xff1a; 只需要经过两步&#xff1a;1.按下esc键 2.输入":wq"(保存退出) 输入":q!"(不保存退出) 在文件名前面加./ ,表示在当前目录中查找该文件 例如执行可执行文…

拥有您的堆:使用JVMTI迭代类实例

今天&#xff0c;我想谈一谈我们大多数人每天都不会看到和使用的另一种Java&#xff0c;更确切地说&#xff0c;是有关较低级别的绑定&#xff0c;一些本机代码以及如何执行一些小的魔术。 尽管我们不会在JVM上找到真正的魔力源&#xff0c;但是在单个帖子的范围内可以实现一些…

Dojo高级Web2.0 UI组件库---Tree组件

Tree组件可以把有层次关系的数据用树状结构展现出来&#xff0c;就如同 Windows 系统的资源浏览器。Tree有两个模板&#xff0c;一个是Tree模板&#xff0c;一个是TreeNode模板&#xff0c;应该说Tree模板就是一个容器&#xff0c;里面有很多TreeNode.而初始化树&#xff0c;打…

使用Java 8防止日志过宽

一些日志将被机器消耗并永久保存。 其他日志仅用于调试和供人类使用。 在后一种情况下&#xff0c;您通常要确保您不会产生过多的日志&#xff0c;尤其是不会产生太宽的日志&#xff0c;因为一旦行长超过一定大小&#xff08; 例如&#xff0c;此Eclipse bug &#xff09;&…

[one day one question] webpack打包压缩 ES6 js、.vue报错

问题描述&#xff1a; 报错&#xff1a; ERROR in js/test.js from UglifyJs Unexpected token punc ?(?, expected punc ?:? [js/test.js:1374,5]&#xff0c;这怎么破&#xff1f; 解决方案&#xff1a; 配置babel&#xff0c;把配置放到文件【.babelrc】中{"prese…

UVA10236 斐波那契素数

题意&#xff1a;任取斐波那契数列中一项f[i],若对于所有j 解法&#xff1a;这题的理论分析在黑书上有&#xff0c;结论是从第五项开始下标为素数的斐波那契数都是斐波那契素数 #include <stdio.h> #include <string.h> const int MAXN 250010;; int prime[25010]…

[one day one question] safari缓存太厉害

问题描述&#xff1a; safari缓存太厉害&#xff0c;这怎么破&#xff1f; 解决方案&#xff1a; window.onpageshow function(event) {if (event.persisted) {window.location.reload() }}; 君生我未生&#xff0c;我生君已老 君恨我生迟&#xff0c;我恨君生早 君生我未生&…

Android 网络编程之Http通信

Android中提供的HttpURLConnection和HttpClient接口可以用来开发HTTP程序。以下是本人在学习中的总结与归纳。1. HttpURLConnection接口 首先需要明确的是&#xff0c;Http通信中的POST和GET请求方式的不同。GET可以获得静态页面&#xff0c;也可以把参数放在URL字符串后面&…

EE Servlet 3:在Servlet中生成HTML输出

如果您只需要在EE Web模块中处理少量请求URI&#xff0c;则在Servlet代码中生成自己HTML响应可能比使用完整的模板库更容易。 作为示例的一部分&#xff0c;我尝试了一个非常简单的Java DSL&#xff0c;该Java DSL在编写自己的Serlvet时生成html输出。 代码如下&#xff1a; p…

[one day one question] express 不缓存如何实现

问题描述&#xff1a; express 默认缓存&#xff0c;这怎么破&#xff1f; 解决方案&#xff1a; apiRoutes.use(function (req, res, next) {res.setHeader(Cache-Control, no-cache, no-store, must-revalidate);res.setHeader(Pragma, no-cache);res.setHeader(Expires, 0)…

正则表达式摘录

正则表达式到底是什么东西&#xff1f;在编写处理字符串的程序或网页时&#xff0c;经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说&#xff0c;正则表达式就是记录文本规则的代码。常用元字符 代码说明.匹配除换行符以外的任意…

Java生态系统– 2014年我的5大亮点

1. 2月1日-RedMonk Analyst公司宣布Java比以往任何时候都更加流行和多样化&#xff01; 2014年&#xff0c;随着FOSDEM的Free Java会议室的年会&#xff0c;Java生态系统开始轰轰烈烈地响起。 除了关于OpenJDK和相关主题的许多精深的技术讲座外&#xff0c;Steve OGrady&#x…

WEB前端大神之路之基础篇

CSS篇&#xff1a; 1.CSS权重&#xff1a; 不重复造轮子啦&#xff0c;直接传送门&#xff08;CSS选择器的权重与优先规则&#xff09; JavaScript篇&#xff1a; 1.this关键字&#xff1a; 它是一种引用&#xff08;referent&#xff09;。指向的是当前上下文&#xff08;con…

与Java EE和Camel的轻量级集成

Enterprise Java具有不同的风格和观点。 从简单的平台技术开始&#xff0c;即众所周知的Java EE&#xff0c;再到不同的框架和集成方面&#xff0c;最后是涉及以数据为中心的用户界面或特定可视化效果的用例。 Java EE本身无法解决的最突出的问题是“集成”。 有许多来自知名供…

java=====Striing date 转化

java中string与date(日期)格式之间的转换 经常遇到string和date之间的转换&#xff0c;把相关的内容总结在这里吧&#xff1a; 1.string格式转化为Date对象&#xff1a; //把string转化为dateDateFormat fmt new SimpleDateFormat("yyyy-MM-dd"); Date date fmt.par…

oracel Pipelined pipe row的用法

oracle的管道也可以返回集合类型&#xff0c;跟游标类似 CREATE TYPE my_type AS OBJECT ( field1 NUMBER, field2 VARCHAR2 (50) ); CREATE TYPE my_typelist AS TABLE OF my_type; CREATE OR REPLACE FUNCTION pipelineme RETURN my_typelist PIPELINED IS -…