2017-02-09 16 views
0

在一个大的代码的基础上,有可能是错误的记录器初始化这样的:如何在大型Java代码库中找到具有错误类名的记录器?

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但我没有得到它的任何工作。

+0

你想要一个命令行'grep'来识别这些文件吗? – Inian

+0

只是简单的告诉我哪些文件是可疑的。它可以在Eclipse搜索,命令行中,无论标准程序员工具如何递归检查文件树并返回可疑文件名。编写一个完整的java程序似乎对于这么简单的事情来说太过分了。我想知道是否可以用正则表达式... – Paramaeleon

回答

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(); 
      } 
     }); 
    } 

显然它很快速和肮脏。 ;-)

相关问题