【问题标题】:How to find loggers with wrong class names in a large Java codebase?如何在大型 Java 代码库中查找类名错误的记录器?
【发布时间】:2017-02-09 09:14:51
【问题描述】:

在大型代码库中,可能会出现如下错误的记录器初始化:

public class MyClass implements Whatever {

    private static final Logger logger = Logger.getLogger(WrongClass.class);

(应改为 getLogger(MyClass.class))。我正在寻找一种快速而肮脏的方法来发现它们而无需编写整个程序。误报,如果不是太多(例如内部类)是可以接受的。

我在 Eclipse 中尝试了这个正则表达式搜索,但它与我上面的示例不匹配:

(?s)(?<!class \1.*)Logger.getLogger\((\w+)\.class

我也想过一些find -exec grep -q \; -print,但我也没有让它发挥作用。

【问题讨论】:

  • 您需要命令行grep 来识别这些文件吗?
  • 简单的告诉我哪些文件是可疑的。它可以在 Eclipse 搜索、命令行、任何标准程序员工具中递归检查文件树并返回可疑文件名。对于这么简单的事情,编写一个完整的 java 程序似乎太过分了。我想知道是否可以使用正则表达式......

标签: regex eclipse grep find negative-lookbehind


【解决方案1】:

我遇到了同样的挑战,但没有及时使用 find/grep/sed/awk 等。于是我决定写一个Java小程序:

public static void main(String[] args) throws IOException {
    Files.walk(Paths.get("/path/to/sources")).filter(p -> p.toFile().isFile() && p.getFileName().toFile().getName().endsWith(".java"))
        .forEach(p -> {
            String filename = p.toFile().getName();
            String clazz = filename.split("\\.")[0];
            try {
                FileUtils.readLines(p.toFile()).forEach(line -> {
                    if (line.contains("getLog(") || line.contains("getLogger(")) {
                        if (line.matches(".*\\([ ]*" + clazz + "\\.class[ ]*\\).*")) {
                            System.out.println(String.format(" ok: %s: %s", p, line.trim()));
                        } else {
                            System.out.println(String.format("nok: %s: %s", p, line.trim()));
                        }
                    }
                });
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
  }

显然它又快又脏。 ;-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-13
    • 2021-08-14
    • 2013-10-12
    • 2023-01-19
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多