现场故事:从Log4J迁移到Log4J2

通过从应用程序中学习企业APM产品,发现更快,更高效的性能监控。 参加AppDynamics APM导览!

与许多Java应用程序一样,AppDynamics Java代理广泛使用日志记录。 多年来,我们一直使用Log4J作为日志记录框架。 虽然Log4J的最新版本是2012年–并且Apache基金会于2015年8月宣布Log4J的生命周期终止 –但我们没有升级到Log4J2,因为需要维护对Java 5 VM和其他竞争优先级的支持。 。 但是,我们最近从整体存储库转移到特定于产品的存储库使升级成为可能。

Log4J2充满了诱人的功能。 例如,该框架通过提供无垃圾记录,极大地提高了记录速度并减少了内存使用。 通过对异步日志记录的本机支持,我们可以进一步减少在客户应用程序上运行时花费在日志记录上的时间。 由于压缩也是本机功能,因此我们的代理可以承受更多日志记录,同时减少文件存储需求。 这两个功能使我们能够添加更频繁,质量更高的日志记录,其中包含可为我们的客户成功提供可行信息的信息,以及可帮助客户的开发团队。

迁移目标和挑战

那么,我们想通过迁移完成什么? 在迁移过程中我们面临什么挑战?
让我们从挑战开始:

–我们必须对框架包进行命名空间,以将Log4J的使用与客户的日志记录框架隔离开来,并且我们还需要使源Java 5兼容,因为标准Log4J2需要Java 1.6及更高版本。

–由于几乎每个班级都使用日志记录,因此我们必须找到一种方法来使这些更改递增,并且(相对)易于检查,以保持生产监控代理所需的高质量。

–万一Log4J2初始化失败,我们必须能够使用Log4J(已被证明可以工作)。
我们的首要目标是用Java 5兼容源重新打包jar。 这一步很容易。 我们以编程方式重构了所有类,以为其包命名空间。 我们手动修复了一些涉及仅Java 6及更高版本支持的API的问题,例如String.isEmpty()。

第二步是在兼容环境中测试框架。 我们使用了一个已安装Java 5的docker容器,并创建了一个反映我们代理结构的测试应用程序。 这一步很耗时,因为我们需要弄清楚配置和自定义如何与我们的代理一起使用。 例如,我们拥有的功能之一就是代理错误安全性。 如果代理代码遇到太多内部错误,我们将使日志静音并删除检测。 我们拥有的另一个功能是重用节点名称。 我们缓冲日志事件,仅在从UI知道节点名称后,才将其写入文件。 使用测试应用程序,我们能够模拟所有这些功能,为迁移做准备。

为了实现可逆性,我们仍然同时存在两个框架。 我们使用桥接模式将日志记录提取到单独的共享包中。 这使我们在代码库中拥有多个日志记录框架,并且我们可以在运行时轻松地在它们之间进行切换。 它还允许我们将来升级日志记录框架,从而提供高度的灵活性和可变性。 这一步很重要,因为我们必须更改构建脚本并更改使用记录器的每个文件。

最后,我们简单地移动了从第二步创建的自定义附加程序的Log4J2版本,复制了配置代码,并由此成功地升级了日志记录框架!

4.4中的Log4J2日志关联支持

在使用Log4j2时,我们还借此机会在日志关联功能中增加了对它的支持。
日志关联使用户可以在其日志附加器模式中指定一个地点,以便我们在运行时插入我们的业务交易(BT)请求guid。 在BT上下文中对记录器的任何调用都将动态地插入guid,而不管该行最终是在文件中还是在控制台中结束。

这些向导在日志输出中的存在可增强日志处理应用程序的功能,包括我们自己的Log Analytics产品,还包括诸如Splunk之类的其他产品。 使用它们,我们可以将单个交易记录的任何行与我们在APM端针对该请求收集的快照数据相关联,而无需对客户应用程序进行任何更改。 相反,它也使我们Controller的用户可以轻松地从BT快照过渡到日志中该BT请求期间发生的确切行。

除了对Log4J2的新支持之外,受支持的日志记录框架还包括Log4J,Logback和Slf4J。

最后的想法

首先,要进行产品范围的升级是一项艰巨的任务。 但是,一旦分解成小的独立步骤,它将变得更加易于管理。 运行10k似乎比运行10个1ks困难。 升级进行得很顺利,因为每一步都对产品进行了更改,同时保持了产品的功能性并准备好发货。 这对于更快地进行构建验证和代码审查是有好处的。

要了解更多信息,请参阅有关业务交易和日志关联的文档。 想了解AppDynamics Log Analytics的工作原理吗? 立即开始免费试用 。

通过从应用程序中学习企业APM产品,发现更快,更高效的性能监控。 参加AppDynamics APM导览!

Li Haojun Li是此博客文章的合著者。 Haojun是一位软件工程师,已经在AppDynamics工作了大约5个月。 他是加州大学伯克利分校的应届毕业生,拥有计算机科学和统计学学位。 周末期间,他喜欢在道路上航行和骑自行车。

翻译自: https://www.javacodegeeks.com/2018/03/tales-from-the-field-migrating-from-log4j-to-log4j2.html

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

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

相关文章

Java面向对象(8)--继承性

多个类中存在相同属性和行为时,可以将这些内容抽取到单独一个类中,那么多个类无需再定义这些相同的属性和行为,只要继承那个类即可。 这里的多个类称为子类(派生类),单独的这个类称为父类(基类或超类)。 语法格式:cla…

aimesh node重启_华硕 RT-AC86U 和 网件 R7000 组 AiMesh 成功

家里之前买了一个 R7000 主路由器,后来我嫌我房间里的信号有点烂( 5G 信号只能 2 格,网速比 2.4G 还慢),所以就入手了一个华硕 RT-AC86U 作为主路由器,R7000 则作为 AP。在买的时候就想组 AiMesh,但是因为种种事情耽搁…

Java面向对象(9)--方法的重写(override/overwrite)

在子类中可以根据需要对从父类中继承来的方法进行改造,也称为方法的重置、覆盖。在程序执行时,子类的方法将覆盖父类中同名同参数列表的方法。 权限修饰符 返回值类型 方法名(形参列表) throws 异常类型{方法体; }①子类重写的方法…

maven ant_如何在Maven中运行Ant目标?

maven antmaven-antrun-plugin允许我们在各种maven构建阶段中运行ant目标。 我将专门为具有开发环境的开发人员解释maven-antrun-plugin的非常实际的用法。 通常,使用maven build,您会将项目捆绑到war文件或ear文件中。 您可以使用maven-antrun-plugin…

java中打开文件显示_在默认文件资源管理器中打开文件,并使用JavaFX或普通Java突出显示它...

我想做标题所说的.部分解决方案例如,在Windows中,您可以使用以下代码在默认资源管理器中打开文件并突出显示它.(虽然它需要修改包含空格的文件):/*** Opens the file with the System default file explorer.** param path the path*/public static void openFileLo…

win10下vscode配置c语言环境

1、C编译器下载 C编译器(MinGW-W64 GCC)的下载:点击官方下载 或者点击网盘下载提取码为karj 下载完成后解压,将解压后的文件夹放到合适的位置,点开其bin子文件夹,复制路径。 2、win10下环境变量配置 ①…

java jdbc 乱码_【求助】为什么用纯java jdbc插入mysql一直乱码

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼String str "人造革";//gbk编码使用2个字节表示一个汉字,所以buffer的长度应该为6byte[] buffer str.getBytes("gbk");//[-56, -53, -44, -20, -72, -17]System.out.println("gbk编码的byte信息:"…

Java面向对象(10)--super关键字

在子类中使用super来调用父类中的指定操作: ①super可用于访问父类中定义的属性 ②super可用于调用父类中定义的成员方法 ③super可用于在子类构造器中调用父类的构造器 super的追溯不仅限于直接父类。 我们可以在子类的方法或构造器中,通过使用"s…

Java的Gradle依赖关系,使用编译还是实现?

当我向一位同事解释如何将Gradle用于Java项目时(他正在远离Maven ),我们遇到了各种代码示例。 有些示例将编译配置用于依赖项,而其他示例则使用Implements和api 。 dependencies { compile commons-httpclient:commons-httpclien…

Java面向对象(11)--多态性

父类 变量名 new 子类();对象的多态性:父类的引用指向子类的对象 Java引用变量有两个类型:编译时类型和运行时类型。编译时类型由声明 该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。简…

java如何替换字符串0A_我有一个带有“ \ u00a0”的字符串,我需要将其替换为“” str_replace failed...

我需要清理来自各种Microsoft Office套件应用程序(Excel,Access和Word)的字符串(复制/粘贴),每个应用程序都有自己的一组编码。我将json_encode用于调试目的,以便能够看到每个编码的字符。我可以使用str_replace清除到目前为止找到的所有内容…

Java面向对象(12)--对象类型转换 (Casting )

基本数据类型的Casting: ①自动类型转换:小的数据类型可以自动转换成大的数据类型 如long g20; double d12.0f ②强制类型转换:可以把大的数据类型强制转换(casting)成小的数据类型 如 float f(float)12.0; int a(int)1200L Java对象的强制…

知识蒸馏 循环蒸馏_Java垃圾收集蒸馏

知识蒸馏 循环蒸馏串行,并行,并发,CMS,G1,Young Gen,New Gen,Old Gen,Perm Gen,Eden,Tenured,Survivor Spaces,Safepoints和数百个JVM…

Java面向对象(13)--==操作符与equals方法

:运算符 可以使用在基本数据类型变量和引用数据类型变量中 ①如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等(类型不一定要相同,当要能够统一)。 int i 9;int j 9;double d 9.0;System.out.println(i j); //trueSystem.out.println…

ubuntu php pear_ubuntu下安装pear包(lynx和php-cli安装)

如果已经安装了lynx和php5-cli,那么就可以很方便的安装pear包了。如果安装了lynx和php5-cli,直接运行 # lynx -source http://pear.php.net/go-pear | php 就可以出现安装界面了。直接按提示回车就行了。遇到y/n选择直接y就可以了。不需要输入任何东西就可以全部安装…

Javascript中的AES加密和Java中的解密

AES代表高级加密系统,它是一种对称加密算法,很多时候我们需要在客户端加密一些纯文本(例如密码)并将其发送到服务器,然后由服务器解密以进行进一步处理.AES加密和解密更加容易在相同的平台(例如Android客户…

toString()方法使用

toString()方法在Object类中定义,其返回值是String类型,返回类名和它的引用地址。在进行String与其它类型数据的连接操作时,自动调用toString()方法。 Account account new Account(); System.out.println(account); //com.atyeman.Account…

php 睡眠,php输出与sleep()

您要实现的是从PHP向浏览器的增量输出.这是否可实现取决于您的服务器以及您如何调用PHP.FastCGI下的PHP当PHP在FastCGI下而不是作为Apache模块运行时,你可能更容易遇到这种问题,因为服务器和PHP进程之间的耦合并不紧密耦合.一旦数据离开PHP进程,FastCGI通信就使用输出缓冲,只有…

Java面向对象(14)--包装类的使用

针对八种基本数据类型定义相应的引用类型—包装类&#xff08;封装类&#xff09;&#xff0c;有了类的特点&#xff0c;就可以调用类中的方法。 基本数据类型 <——> 包装类&#xff0c;String——>包装类 ①装 int num 9; Integer int1 new Integer(num); Syste…

php读取mp3信息,PHP获取MP3的媒体标签信息

PHP如何获取MP3的媒体标签信息&#xff1f;本文主要介绍了PHP获取音频文件的相关信息的相关资料。希望对大家有所帮助。项目需求&#xff1a;现在有一个音频文件上传的功能&#xff0c;在上传后PHP需要获取这个音频文件的相关信息&#xff0c;例如&#xff1a;时长等&#xff0…