如何在大型 Java 代码库中查找 class 名称错误的记录器?
How to find loggers with wrong class names in a large Java codebase?
在大型代码库中,可能会出现如下错误的记录器初始化:
public class MyClass implements Whatever {
private static final Logger logger = Logger.getLogger(WrongClass.class);
(应该是 getLogger(MyClass.class)
)。我正在寻找一种快速而肮脏的方式来发现它们而无需编写整个程序。误报,如果不是太多(例如内部 类)是可以接受的。
我在 Eclipse 中尝试了这个正则表达式搜索,但它与我上面的例子不匹配:
(?s)(?<!class .*)Logger.getLogger\((\w+)\.class
我也想过一些find -exec grep -q \; -print
,但我也没能实现。
我遇到了同样的挑战,但没有及时通过 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();
}
});
}
显然它又快又脏。 ;-)
在大型代码库中,可能会出现如下错误的记录器初始化:
public class MyClass implements Whatever {
private static final Logger logger = Logger.getLogger(WrongClass.class);
(应该是 getLogger(MyClass.class)
)。我正在寻找一种快速而肮脏的方式来发现它们而无需编写整个程序。误报,如果不是太多(例如内部 类)是可以接受的。
我在 Eclipse 中尝试了这个正则表达式搜索,但它与我上面的例子不匹配:
(?s)(?<!class .*)Logger.getLogger\((\w+)\.class
我也想过一些find -exec grep -q \; -print
,但我也没能实现。
我遇到了同样的挑战,但没有及时通过 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();
}
});
}
显然它又快又脏。 ;-)