如何通过7个Logback调整立即改善Java日志记录

duke_log1

基准测试可帮助您发现Logback在压力下的性能

日志记录对于服务器端应用程序是必不可少的,但这是有代价的。 令人惊讶的是,微小的更改和配置调整对应用程序的日志记录吞吐量有多大影响。 在这篇文章中,我们将根据每分钟的日志条目对Logback的性能进行基准测试。 我们将找出哪些追加程序性能最佳,什么是谨慎模式以及Async方法,筛选和控制台日志记录的一些令人敬畏的副作用是什么。 让我们开始吧。

基准测试的基础

Logback的核心是基于Log4j,并根据CekiGülcü的愿景进行了调整和改进。 或如他们所说, 更好的Log4j 。 它具有本机slf4j API,更快的实现,XML配置,审慎的模式以及一组有用的Appender,我将在稍后详细介绍。

话虽这么说,但是有许多方法可以使用Logback上可用的不同Appender,模式和模式进行记录。 我们采用了一组常用的组合,并在10个并发线程上进行了测试,以找出运行速度更快的组合。 每分钟写入的日志条目越多,该方法越有效,并且有更多资源可用于为用户服务。 这不是一门精确的科学,但更确切地说,我们已经对每个测试运行了5次,删除了顶部和底部的异常值,并取了结果的平均值。 为了公平起见,所有写入的日志行也具有相等的200个字符的长度。

**所有代码都可以在GitHub的权利在这里 。 该测试在Debian Linux机器上运行,该机器在具有8GB RAM的Intel i7-860(4核@ 2.80 GHz)上运行。

第一个基准:同步日志文件的成本是多少?

首先,我们看一下同步和异步日志记录之间的区别。 既写入单个日志文件,FileAppender都将条目直接写入文件,而AsyncAppender将条目馈入队列,然后写入队列。 默认队列大小为256,当队列大小为80%时,它将停止输入较低级别的新条目(WARN和ERROR除外)。

01

该表在FileAppender和AsyncAppender的不同队列大小之间进行比较。 异步以500个队列大小排在首位。

  • 调整#1: AsyncAppender的速度可以比同步FileAppender快3.7倍。 实际上,这是跨所有附加程序记录的最快方法。

它的性能比默认配置要好,该默认配置甚至落后于应该最后完成的同步FileAppender。 那么可能发生了什么?

由于我们是从10个并发线程中写入INFO消息,因此默认队列大小可能太小,消息可能丢失到默认阈值。 查看500和1,000,000队列大小的结果,您会注意到它们的吞吐量相似,因此队列大小和阈值对他们来说不是问题。

  • 调整#2:默认的AsyncAppender可能导致性能降低5倍,甚至丢失消息。 确保根据需要自定义队列大小和丢弃阈值。
<appender name="ASYNC500" class="ch.qos.logback.classic.AsyncAppender">
<queueSize>500</queueSize>
<discardingThreshold>0</discardingThreshold>
<appender-ref ref="FILE" />
</appender>

**设置AsyncAppender的queueSize并丢弃Threshold

第二基准:消息模式真的有作用吗?

现在,我们想看看日志输入模式对写入速度的影响。 为了公平起见,即使使用不同的模式,我们也使日志行的长度相等(200个字符)。 默认的Logback条目包括日期,线程,级别,记录器名称和消息,通过尝试使用它,我们试图查看对性能的影响。

02

该基准测试演示并帮助您了解记录器命名约定的好处。 请记住,要相应地将其名称更改为您在其中使用的类。

  • 调整#3:按类名命名记录器可将性能提高3倍。

取消记录器或线程名称后,每分钟会增加大约40k-50k条目。 无需编写您将不使用的信息。 最小化也被证明更有效。

  • 调整#4:与默认模式相比,仅使用“级别”和“消息”字段每分钟提供了127k多个条目。

第三基准:亲爱的审慎,你不会出来玩吗?

在审慎模式下,可以从多个JVM访问单个日志文件。 由于需要处理另一个锁,因此这当然会影响性能。 我们使用之前运行的相同基准测试了在2个JVM上写入单个文件的谨慎模式。

03

谨慎模式会如预期般受到打击,尽管我的第一个猜测是影响会更大。

  • 调整#5:仅在绝对需要时才使用谨慎模式,以避免吞吐量下降。
<appender name="FILE_PRUDENT" class="ch.qos.logback.core.FileAppender">
<file>logs/test.log</file>
<prudent>true</prudent>
</appender>

**在FileAppender上配置审慎模式

第四个基准:如何加快同步日志记录?

让我们看看FileAppender以外的同步追加程序如何执行。 ConsoleAppender写入system.out或system.err(默认为system.out),当然也可以通过管道传输到文件。 这就是我们能够计算结果的方式。 SocketAppender通过TCP套接字写入指定的网络资源。 如果目标脱机,则该消息将被丢弃。 否则,它将像在本地生成一样被接收。 对于基准测试,套接字正在将数据发送到同一台计算机,因此我们避免了网络问题。

04

令我们惊讶的是,通过FIleAppender进行显式文件访问比编写控制台并将其通过管道传输到文件要昂贵得多。 相同的结果,不同的方法,每分钟增加约200k日志条目。 尽管在两者之间添加了序列化,但SocketAppender的性能与FileAppender相似,但网络资源(如果存在)将承担大部分开销。

  • 调整#6:将 ConsoleAppender管道传输到文件提供的吞吐量比使用FileAppender高13%。

第五基准:现在我们可以把它提高一个档次吗?

我们工具栏中的另一个有用方法是SiftingAppender。 筛选允许将日志分为多个文件。 我们的逻辑是创建4个单独的日志,每个日志保存我们在测试中运行的10个线程中的2或3个日志。 这是通过指示鉴别符(在本例中为logid)来完成的,该鉴别符确定日志的文件名:

<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator>
<key>logid</key>
<defaultValue>unknown</defaultValue>
</discriminator>
<sift>
<appender name="FILE-${logid}" class="ch.qos.logback.core.FileAppender">
<file>logs/sift-${logid}.log</file>
<append>false</append>
</appender>
</sift>
</appender>

**配置SiftingAppender

05

我们的FileAppender再次失败了。 输出目标越多,锁的压力就越小,上下文切换也就越少。 与Async示例相同,日志记录的主要瓶颈被证明是同步文件。

  • 调整#7:使用SiftingAppender可使吞吐量提高3.1倍。

我们发现,实现最高吞吐量的方法是使用自定义的AsyncAppender。 如果必须使用同步日志记录,则最好对结果进行筛选,并按某种逻辑使用多个文件。 我希望您发现Logback基准测试的见解有用,并希望在下面的评论中听到您的想法。

翻译自: https://www.javacodegeeks.com/2014/07/how-to-instantly-improve-your-java-logging-with-7-logback-tweaks.html

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

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

相关文章

JS中的编码

今天发现我输入的中文变成了另外一种格式&#xff0c;查了一下&#xff0c;原来是转换成了数字编码。在这里介绍一下数字编码和base64&#xff0c;做个记录 1.出现原因&#xff1a;在开发中经常需要对用户输入的数据进行编码然后才能通过HTTP请求发送给后台&#xff0c;或者对…

commonJS — DOM操作(for DOM)

for DOM github: https://github.com/laixiangran/commonJS/blob/master/src/forDOM.js 代码 /*** Created by laixiangran on 2016/1/24* homepage&#xff1a;http://www.cnblogs.com/laixiangran/* for DOM*/(function(undefined) {var com window.COM window.COM || {};…

deMeer5_Attacker

SoccerCommand Player::deMeer5_Attacker(){SoccerCommand soc(CMD_ILLEGAL);if (WM->isBeforeKickOff()){if (formations->getFormation() ! FT_INITIAL || //不在开球的阵型 WM->getAgentGlobalPosition().getDistanceTo(WM->getStrategicPosition()) > 2.…

【Flutter】解决依赖版本冲突

为什么会存在版本依赖问题 我们在开发flutter项目中&#xff0c;常常会依赖第三方库。flutter依赖项越多&#xff0c;就越有可能出现依赖版本冲突。 Because new_trend depends on build_runner >0.9.0 which requires SDK version >2.0.0-dev.61 <3.0.0, version sol…

安装vue-cli时报错

今天用npm安装vue-cli时一直报错&#xff0c;后面百度说用cnpm重装&#xff0c;结果还是报错&#xff0c;后面找到一个博主的&#xff0c;说是vue升级的原因&#xff0c;vue init webpack hello-world 已经替换为 vue create hello-world npm install -g vue/cli-init # vue…

从JPA到Hibernate的旧版和增强型标识符生成器

JPA标识符生成器 JPA定义了以下标识符策略&#xff1a; 战略 描述 汽车 持久性提供程序选择基础数据库支持的最合适的标识符策略 身份 标识符由数据库IDENTITY列分配 序列 持久性提供程序使用数据库序列来生成标识符 表 持久性提供程序使用单独的数据库表来模拟序列对…

快速了解AngularJs HTTP响应拦截器

任何时候&#xff0c;如果我们想要为请求添加全局功能&#xff0c;例如身份认证、错误处理等&#xff0c;在请求发送给服务器之前或服务器返回时对其进行拦截&#xff0c;是比较好的实现手段。 angularJs通过拦截器提供了一个从全局层面进行处理的途径。 四种拦截器 实现 req…

U盘专杀工具,U盘防御软件,U盘病毒防火墙--UDiskSyS

近来闲聊无事&#xff0c;写了一款专门针对U盘的防御软件&#xff0c;U盘插入后自动扫描并清除病毒并还原被感染的文件。是常见的文件夹伪装病毒&#xff0c;死亡应答病毒&#xff0c;exe感染型病毒的克星。UDiskSyS不像那些所谓的正规杀毒软件遇到搞不定的病毒统统删除之&…

CenterNet算法笔记(目标检测论文)

论文名称&#xff1a;CenterNet: Keypoint Triplets for Object Detectiontection 论文链接&#xff1a;https://arxiv.org/abs/1904.08189 代码链接&#xff1a;https://github.com/Duankaiwen/CenterNet 简介 该论文是由中科院&#xff0c;牛津大学以及华为诺亚方舟实验室联合…

git提交代码时报错:nothing added to commit but untracked files present

原因&#xff1a; git没有把提交的文件加载进来&#xff0c;报红色的是需要提交的文件&#xff0c; 解决步骤&#xff1a; 用git add XXX(文件名) 把提示报红色的文件加上git commit -m “xx”git push -u origin master重新提交就可以了

VSS使用手册

1 VSS概述 版本控制是工作组软件开发中的重要方面&#xff0c;它能防止意外的文件丢失、允许反追踪到早期版本、并能对版本进行分支、合并和管理。在软件开发和您需要比较两种版本的文件或找回早期版本的文件时&#xff0c;源代码的控制是非常有用的。Visual SourceSafe 是一种…

语句和函数

1.for-in语句&#xff1a;是一种精准的迭代语句&#xff0c;可以用来枚举对象的属性。 2.label语句&#xff1a;在代码中添加标签&#xff0c;以便将来使用&#xff0c;由break和continue语句调用。3.with语句&#xff1a;将代码的作用域设置到一个特定的对象中。一般不建议过多…

服务器与客户端渲染(AngularJS与服务器端MVC)

关于服务器与客户端应用程序渲染的讨论很多。 虽然没有“一刀切”的解决方案&#xff0c;但我将尝试从不同的角度主张客户端&#xff08;特别是AngularJS&#xff09;。 首先是建筑。 建筑 做得好的架构已经明确定义了关注点分离&#xff08;SoS&#xff09; 。 在大多数情况下…

MySQL 数据类型简介 创建数据表及其字段约束

数据类型介绍 MySQL 数据类型分类 整型浮点型字符类型(char与varchar)日期类型枚举与集合具体数据类型见这篇博客 MySQL表操作中的约束 primary key 主键约束 非空唯一unique key 唯一约束not null 非空约束foreign key 外键约束创建表的的语法 CREATE TABLE[IF NOT EXISTS] tb…

elementUI的container布局设置全屏宽度

进用element UI的 container 布局&#xff0c;发现不能全屏铺满 添加了一行代码&#xff1a; .el-container{height:100%;padding:0;margin:0;width:100%;}发现高度占满全屏&#xff0c;但是宽度还没有 继续给 html,body加了 width&#xff1a;100%&#xff1b;还是没有任何…

【转】首次敏捷项目开发实践

首次采用敏捷方式进行开发&#xff0c;我想把我们的做法与大家分享下&#xff0c;同时希望大家指出我们的不足和需要改进的地方&#xff0c;让我们的项目进行的更顺利&#xff0c;目前项目已过三分之一&#xff0c;客户比较满意&#xff0c;还算顺利。项目简介&#xff1a;一个…

CSS border-radius边框圆角

在CSS3中提供了对边框进行圆角设定的支持&#xff0c;可对边框1~4个角进行圆角样式设置。 目录 1. 介绍 2. value值的格式和类型 3. border-radius 1~4个参数说明 4. 在线示例 1. 介绍 1.1 圆角属性 CSS3提供了5种圆角属性 border-radius &#xff1a;同时设置4个边框的…

element实现动态路由+面包屑

要掌握&#xff1a;localStorage&#xff0c;组件封装 ​​​​ emm&#xff0c;第一次上传视频转gif的图片&#xff0c;效果不咋好。。。 视频转gif 的软件连接 http://www.zxt2007.com/downloads.html 找到一个可以截取部分视频制作gif图的软件https://soft.onlinedo.cn/gif…

Matlab——矩阵运算 矩阵基本变换操作

矩阵运算 加 - 减 .* 乘 ./ 左除 .\ 右除 .^ 次方 . 转置 除了加减符号&#xff0c;其余的运算符必须加“.” >> a 1:5a 1 2 3 4 5>> a-2 %减法ans -1 0 1 2 3 >> 2.*a-1 %乘法 减法ans 1 3 5 7 9 >&g…

Oracle最新的Java 8更新破坏了您的工具-它是如何发生的?

如果您最近一直在关注Java世界的消息&#xff0c;那么您可能听说过Oracle发布的最新Java 8构建&#xff0c;Java 8u11&#xff08;和Java 7u65&#xff09;引入了错误并破坏了一些流行的第三方工具&#xff0c;例如ZeroTurnaround的JRebel&#xff0c;Javassist&#xff0c;Goo…