自动检测log4j静态初始化错误的方法

2024-05-11

(请注意,这更像是 Bash 问题,而不是 Java 问题,请参阅下面的注释)

在每个类中配置log4j时,我们执行以下操作:

public class Example {

  private static final Logger log = Logger.getLogger( Example.class );

问题是我们现在有一个中等规模的代码库(200K LOC),其中包含大量 Java 类和......相当多的配置错误的 log4j 记录器。

这是因为人们(包括我,我承认)做了愚蠢的剪切和粘贴,有时会导致以下结果:

public class Another {

  private static final Logger log = Logger.getLogger( Example.class );

繁荣,而不是有另类,这是旧的示例.class这是留下来的,因此错误地出现在日志中(因此引起了相当多的头痛)。

我觉得这种错误配置可能发生有点奇怪,但它确实可能发生,我们现在的主要问题不是它可能发生,而是我们必须修复错误配置的记录器。

我们怎样才能自动检测这些呢? (修复可以是手动的,但我想要一种方法来查找 log4j 配置错误的所有类)。

例如,Bash shell 脚本就非常受欢迎。

  1. 对于每个 .java 文件
  2. 查找每个“XXX 类”
  3. 解析接下来的 'x' 行(比如 20)
  4. 有 Logger.getLogger(...) 行吗?
  5. 如果是,是否匹配“XXX类”?
  6. 如果没有报告

误报不是问题,因此如果解析一些伪造的“XXX 类”等,也不是问题。

NOTE:问题实际上是我们现在有 200 000 行代码,我们希望自动检测违规行为(可以手动修复),因此问题与以下内容不同:

【java中有没有更好的方法获取当前类变量?1 https://stackoverflow.com/questions/2151167/is-there-a-better-way-to-get-the-current-class-variable-in-java

实际上,这可能更像是 Bash 问题,而不是 Java 问题:)

欢迎对此提供任何帮助。


我想如果你正在寻找单行,单行

find -name "*.java" -exec sed -i \
    -e 's/private static final Logger \([a-zA-Z_][a-zA-Z0-9_]*).*$/private static final Logger \1 = LoggerFactory.make()/g' \
    -e 's/import org\.apache\.log4j\.Logger;/&\nimport path.to.LoggerFactory;/g' \
    {} \;

在尝试这个之前我会备份你的代码。它可能在几个地方被破坏了,但是通过一些更正就能得到你想要的东西。如果你使用 svn 或其他东西,你必须调整 find 以排除.svn目录,否则你的提交将会变得非常混乱。

要点:甚至不必费心去尝试捕获类名。包含亚历山大间接链接的解决方案 http://www.javaspecialists.eu/archive/Issue137.html。但用工厂调用替换最初的 Logger 声明。您唯一需要捕获的是局部变量的名称。然后你需要找到你的导入在哪里,我假设你可以非常精确地做到这一点,因为你正在导入 log4j (或java.util.logging)。发现import声明并在其下方导入您的工厂。

顺便说一句,您收到的有关自动化此操作的所有警告都是正确的,并且同样适用于该解决方案。你need准备javac至少在尝试之后一切都正确。实际上,您应该拥有一些具有巨大代码覆盖率的测试套件,以便在此时自动运行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自动检测log4j静态初始化错误的方法 的相关文章

随机推荐

  • 采用 std::vector 或 std::array 的模板函数

    我有一个函数 当前接受 2 个向量 其中可以包含任何普通的旧数据 template
  • 如何用方向键移动div

    我想使用 jQuery 用箭头键移动 div 所以右 左 下 上 找到了我想要完成的演示here http atomicrobotdesign com blog htmlcss move objects around the canvas
  • hibernate session 的 get() 和 load() 方法在获取方面有什么区别?

    get 和 load 方法有什么区别 关于数据获取方法 public static void main String args SessionFactory factory new Configuration configure build
  • python matplotlib 使用按钮事件添加和删除图形中的文本

    我试图在调用button press event 时将文本添加到鼠标指针位置的图形中 并在调用button release event 时将其删除 我已成功添加文本 但无法将其删除 这是我使用的代码的一部分 def onclick even
  • Javascript 3d 绘图实用程序? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道有什么好的 javascript 3d 绘图实用程序吗 我知道每个网站都推荐过画布 3d 图
  • 迭代 Sqlite-query 中的行

    我有一个表布局 我想用数据库查询的结果填充它 我使用全选 查询返回四行数据 我使用此代码来填充表行内的 TextView Cursor c null c dh getAlternative2 startManagingCursor c th
  • 从导出的维基百科文章中检索中间语言链接?

    我曾经通过使用一些正则表达式解析导出来从导出的维基百科文章中检索中间语言链接 在第一阶段维基数据项目 https en wikipedia org wiki Wikipedia Wikidata这些链接已移至维基数据上的单独页面 例如文章厄
  • MVC URL 路由自定义 url

    我想传递 url 链接 例如 http localhost 24873 Jobs companyname or http localhost 24873 companyname Jobs Preferred 我尝试在全局 aspx 文件中进
  • 使用 MIPS 从 Big Endian 到 Little Endian 无需逻辑运算?

    我正在使用 MIPS QtSpim 将 32 位字从 Big Endian 转换为 Little Endian 我下面显示的内容已检查且正确 不过我想知道还有什么其他方法可以让我进行转换 我虽然只使用了旋转和移位 但如果没有逻辑运算 我就无
  • 如何以编程方式从 Excel 中的 VBA 宏中删除数字签名?

    有没有办法以编程方式从 Excel 工作表的 VBA 宏中删除数字签名 即相当于进入 VBA 编辑器 转到 工具 菜单 gt 数字签名 并单击 删除 的代码 有趣的问题 出于安全原因 它故意不属于 Excel 对象模型的一部分 可以从证书存
  • 如何使用 Entity Framework 和 Identity 解决对象处置异常 ASP.NET Core

    我正在尝试编写一个控制器 该控制器接收来自 AJAX 调用的请求并通过 DBContext 对数据库执行一些调用 但是 当我发出命令时var user await GetCurrentUserAsynch 在对 DBContext 的任何调
  • 我可以从 DRF 中完全删除序列化程序吗?

    我正在尝试将 Django REST Framework 与 MongoDB 一起使用 我尝试将 Mongoengine 与 Django REST Framework Mongoengine 一起使用 但它不起作用 或者我做错了什么 但缺
  • getline 之后返回到文件开头

    所以我已经从文件中读取了所有行 while getline ifile line logic 其中 ifile 是 ifstream line 是字符串 我的问题是我现在想再次使用 getline 并且似乎无法返回到文件的开头 因为运行 c
  • Azure 函数核心工具安装卡在 Visual Studio Code 中

    我创建了 Azure 函数应用程序来执行 powershell 脚本 想先在我的本地运行它来测试它 当我运行它时 无论有没有调试选项 都会出现一个弹出窗口 其中显示 您必须安装 Azure Functions 核心工具才能调试本地函数 当我
  • 在 WCF 上重用我的 PagedList 对象

    问题 我有一个自定义集合PagedList
  • 自调整大小的集合视图在 iOS 15 中进入递归循环

    我有一个自动调整大小的集合视图 当我调用 super layoutSubviews 时 我的应用程序崩溃 因为集合视图进入递归更新循环 这在 iOS 14 及更低版本中运行良好 但从 iOS 15 开始就观察到了这一点 class Dyna
  • Snakemake如何在上游规则失败时执行下游规则

    抱歉 标题不好 我不知道如何最好地用几句话解释我的问题 当其中一条规则失败时 我在处理 Snakemake 中的下游规则时遇到困难 在下面的示例中 黑桃规则在某些样本上失败 这是预料之中的 因为我的一些输入文件会有问题 黑桃将返回错误 并且
  • Quartz.Net 作业存储查询

    我正在当前项目中使用 Quartz NET 创建调度程序 就我而言 所有需要创建的作业都存储在一个表中 并且有一个单独的 UI 我可以在其中添加新作业或编辑现有作业 我的问题是如何将表中的所有作业提供给 Quartz 调度程序 我是否想要查
  • 有 Google Keep API 吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Google Keep 有 API 吗 我想为 Google Keep 制作一个 Windows 8 应
  • 自动检测log4j静态初始化错误的方法

    请注意 这更像是 Bash 问题 而不是 Java 问题 请参阅下面的注释 在每个类中配置log4j时 我们执行以下操作 public class Example private static final Logger log Logger