git log 迁移_现场故事:从Log4J迁移到Log4J2

git log 迁移

通过从您的应用程序学习企业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导览!

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

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

git log 迁移

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

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

相关文章

mysql firebird 性能_Firebird, MySQL 与 PostgreSQL 代码质量对比

今天看到一篇文章 - “Firebird, MySQL 与 PostgreSQL 代码质量对比”- 关于三个开源 RDBMS 的静态分析比较。主要内容A few words about the projectsFirebirdMySQLPostgreSQLPVS-StudioComparison criteriaWhy "head-on" comparison is not a good ideaAn alterna…

Linux 命令之 let -- bash 中用于计算的工具,用于执行一个或多个表达式

文章目录一、命令介绍二、命令示例自增操作自减操作shell 脚本中的运算表达式一、命令介绍 let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。如果表达式中包含了空格或其他特殊字符,则必须引…

sun jdk 与jdk_Sun过去的世界中的JDK 11和代理

sun jdk 与jdk使用JDK 11后,就sun.misc.Unsafe的第一种方法。 其中, defineClass方法已删除。 代码生成框架通常使用此方法在现有的类加载器中定义新的类。 尽管此方法易于使用,但它的存在也使JVM本质上不安全,正如其定义类的名称…

php mysql上传多张图片_PHP开发之多个文件上传到MySql数据库(一)

前面的章节我们介绍了用PHP实现上传一个文件的教程。朋友们就会有疑问,怎么样才能上传多张多个文件到数据库?重点在于放入几个文件以后点击提交上传之后所有的文件一起上传,并且每个文件都给一个新的路径。提供一种思路:先获取每个…

jdk只有一个java进程_JDK 10:从Java访问Java应用程序的进程ID

jdk只有一个java进程StackOverflow.com上一个普遍的问题是:“ Java程序如何获得自己的进程ID? 与该问题相关的几个答案包括解析ManagementFactory返回的String 。 getRuntimeMXBean() 。 getName() [但是可…

Shell 脚本生成不重复的随机数

#!/bin/bash #AUTHOR:AN #DATE:2019-3-24 #Describe:Generate No-Repeat Random-Number #Method:如生成3~7的随机数,先生成0~4(7-3)的随机数,再加上3(起始值)来修正 #####################################…

python if语句能否判断中文_Python“if”语句被忽略

如果满足多个条件(“or”)中的一个,我将触发Python中的循环。脚本似乎跳过了“if”语句并在不满足所需条件的情况下进入内部循环。在编码# Begin TestCase# Main logic: execute RemoteController macro, if expected state true, set Success, else: Failfor macr…

payara 创建 集群_Payara Micro在Oracle应用容器云上

payara 创建 集群在此博客文章中,我将描述如何将打包在Payara Microber -jar中的CloudEE Duke应用程序部署到Oracle Application Container Cloud 。 在Oracle Application Container Cloud中进行部署所需的部署工件是一个ZIP归档文件,其中包含应用程序…

shell 脚本书写规范

表达式中的运算符之间不允许空格,例如: [roothtlwk0001host ~]# sum 200 300 sum: : 没有那个文件或目录 sum: 200: 没有那个文件或目录 sum: : 没有那个文件或目录 sum: 300: 没有那个文件或目录从上面的输出结果可知,每项前后出现空格&a…

python可以用来整理表格吗_Python将多份excel表格整理成一份表格

利用Python将多份excel表格整理成一份表格,抛弃过去逐份打开复制粘贴的方式。直接附上代码: import xlrdimport xlwtimport osfrom xlutils.copy import copyimport os.pathfrom xlwt import *dir input("输入文件路径\n");start_row input(…

Linux 环境变量启动过程/配置文件的读取过程

环境变量配置文件 对所有用户都起作用 /etc/profile/etc/profile.d/*.sh/etc/bashrc 对当前用户起作用 配置文件在用户家目录下,即用户的主目录下。 ~/.bash_profile~/.bashrc 环境变量启动过程 新进程启动后先将父进程的全局性的环境变量复制一份到自己的栈…

azure blob_使用Azure Blob存储托管Maven工件

azure blob如果您使用Microsoft Azure并且将Java用于项目,则Azure Blob存储是托管团队工件的理想场所。 它很容易设置,而且很便宜。 如果您对它们的功能不特别感兴趣,那么它比设置现有存储库选项(jfrog,nexus&#xf…

angular ngoninit 刷新html页面_web前端入门到实战:实现html页面自动刷新

使用场景:页面需要定时刷新,实时加载数据,需要实时查看监控数据(H5中的WebSocket和SSE可以实现局部刷新)一定时间之后跳转到指定页面(登录注册之类)前端开发使用伪数据调试html页面(…

什么是超越数

超越数,数学概念,指不是代数数的数。超越数的存在是由法国数学家刘维尔(Joseph Liouville,1809 ~ 1882)在1844年最早证明的。关于超越数的存在,刘维尔写出了下面这样一个无限小数:a0.1100010000…

认识JSON补丁:JSON-P 1.1概述系列

Java EE 8包括对JSON处理API的更新,并使其与JSON的最新IEFT标准保持同步。 他们是: JSON指针 RFC 6901 JSON补丁 RFC 6902 JSON合并修补程序RFC 7396 我将在这个迷你系列中涵盖这些主题。 入门 要开始使用JSON-P,您将需要Maven中央存储库…

mysql驱动连接不了mariadb_无法从振动应用程序连接到MySQL / MariaDB数据库

如果我使用自定义main(void main()而不是shared static this()),一切正常.使用默认主菜单时出现“访问冲突”错误.它看起来像MySQL不允许从localhost连接到它,但在my.ini中我添加了字符串:bind-address 127.0.0.1代码,如果有帮助:import std.stdio;impo…

什么是自然数

自然数是指用以计量事物的件数或表示事物次序的数。即用数码 0,1,2,3,4……所表示的数。自然数由 0 开始,一个接一个,组成一个无穷的集体。自然数有有序性,无限性。分为偶数和奇数,合…

angular jwt_Angular5 JWT身份验证(Spring Boot安全性)

angular jwt欢迎使用带有Spring Security的angular5 jwt身份验证。在本教程中,我们将在一个angular5单页应用程序中使用jwt身份验证创建一个全栈应用程序,该应用程序具有由spring boot支持并支持spring security集成的后备服务器。带有集成了HttpInterce…

impacket安装 python_Impacket网络协议工具包介绍

Impacket是一个Python类库,用于对SMB1-3或IPv4 / IPv6 上的TCP、UDP、ICMP、IGMP,ARP,IPv4,IPv6,SMB,MSRPC,NTLM,Kerberos,WMI,LDAP等协议进行低级编程访问。…