如何通过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;或者对…

【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…

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

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

elementUI的container布局设置全屏宽度

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

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…

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

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

为什么选择Dojo - 记Dojo中文博客正式开张

公告栏里写到&#xff1a;Dojo的高门槛一旦跨过&#xff0c;必将别无所求。含义有二&#xff1a;第一&#xff0c;Dojo难学&#xff1b;第二&#xff0c;Dojo很强大。 这也揭示了本博客的目标&#xff1a;帮助大家用好Dojo这个优秀的Ajax框架。 在回答为什么选择Dojo之前&#…

ExtJS 4.2 第一个程序

本篇介绍如何创建一个ExtJS应用程序。并通过创建目录、导入文件、编写代码及分析代码等步骤来解释第一个ExtJS程序。 目录 1. 创建程序 1.1 创建目录建议 1.2 实际目录 1.3 index.html 1.4 运行图 2. 代码分析 2.1 Ext.onReady() 2.2 Ext.create() 1. 创建程序 1.1 创建目录…

ZooKeeper,策展人以及微服务负载平衡的工作方式

Zookeeper如何确保每位工人都能愉快地从工作委托经理那里得到一些工作。 Apache ZooKeeper是注册&#xff0c;管理和发现在不同计算机上运行的服务的工具。 当我们必须处理具有许多节点的分布式系统时&#xff0c;它是技术堆栈中必不可少的成员&#xff0c;这些节点需要知道其…

elementUI清空弹框中的表单数据

点击此处直达应用场景示例 官网&#xff1a;https://element.eleme.cn/#/zh-CN/component/form 补充&#xff1a;改变表头颜色&#xff1a; <el-table :data"tableData" border style"width: 100%" :header-cell-style"{background:#d3dce6,col…

.Net4.0 Parallel编程(三)Data Parallelism下

在上篇文章中介绍了如何Break、Stop循环&#xff0c;以及如何定义线程局部变量。在本文中介绍如何在外部去取消循环、以及异常的处理。 Cancel 在并行的循环中支持通过传递ParallelOptions参数中的CancellationToken进行取消循环的控制&#xff0c;我们可以CancellationTokenSo…

根据可视窗口判断面板向上还是向下展开

本demo以element-ui框架为视图模板~ HTML代码 JS代码 CSS代码 转载于:https://www.cnblogs.com/dreamsqin/p/10885502.html

编写JUnit测试的另一种方法(Jasmine方法)

最近&#xff0c;我为一个小型个人项目编写了很多Jasmine测试。 我花了一些时间才终于感到正确地完成了测试。 此后&#xff0c;当我切换回JUnit测试时&#xff0c;我总是很难过。 出于某种原因&#xff0c;JUnit测试不再那么好&#xff0c;我想知道是否有可能以类似于Jasmine的…

解决vue项目在ie浏览器中不显示的问题

安装 “babel-polyfill” npm install babel-polyfill --save-dev 或者 cnpm install babel-polyfill --save-dev在入口 main.js 文件引入&#xff1a;import babel-polyfill在 build 文件下的 webpack.base.conf.js 文件中修改代码&#xff1a; entry: {app: ["babel-p…

清空表单时出现问题

打开页面时报警告&#xff1a; 解决办法&#xff1a; &#xff08;1&#xff09;npm i default-passive-events -S &#xff08;2&#xff09;main.js中加入&#xff1a;import ‘default-passive-events’ 参考&#xff1a;https://www.jianshu.com/p/23850d4cade8 出现原…

如何在JSF中实现自定义密码强度指示器

使用JavaScript验证密码强度是一项常见任务。 在本文中&#xff0c;我将展示如何向基于JSF的Web应用程序添加密码强度指示器。 的 PrimeFaces中的密码组件已经具有密码强度的反馈指示符&#xff0c;但是它有两个主要缺点&#xff1a; 反馈指示器没有响应&#xff08;固定宽度…

关于vue打包的问题

一、vue-cli2 二、vue-cli3 一、vue-cli2 错误提示&#xff1a; npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! hewelry1.0.0 build: node build/build.js npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the hewelry1.0.0 build script. npm ERR! This is prob…