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

标签 java bash log4j

(请注意,它更像是 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 );

砰的一声,没有 Another.class,而是留下了旧的 Example.class,因此错误地出现在日志中(因此引起了很多麻烦).

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

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

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

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

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

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

[java中获取当前类变量有没有更好的方法? 1

实际上它可能更像是 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 目录,否则您的提交将真的一团糟。

要点:甚至不必费心 try catch 类名。合并the solution indirectly linked to by Alexander .但是用工厂调用替换您的初始 Logger 声明。您唯一需要捕获的是局部变量的名称。然后您需要找到导入的位置,我假设您可以完全做到这一点,因为您正在导入 log4j(或 java.util.logging)。找到 import 语句并在其正下方导入您的工厂。

顺便说一句,您收到的关于自动执行此操作的所有警告都是正确的,并且同样适用于此解决方案。您需要至少在尝试此操作后准备好 javac 一切。真的,您应该有一些具有怪物代码覆盖率的测试套件在此时自动运行。

关于java - 自动检测错误log4j静态初始化的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2154726/

相关文章:

linux - 将 key 发送到终端

java - 使用 jmock 模拟 Logger.getLogger()

java - SWT:具有复制/粘贴功能的表格

java - 在 android 中为类编写 Parcelable 时出现 StackOverflowError

java - ConcurrentHashMap 有什么缺点吗?

java - 匹配全限定类名的正则表达式

bash - alias hello ='echo Hello' - 为什么这在重启后不起作用?

bash - 意外 token “0”附近的语法错误

java - 为什么在尝试使用 log4j 写入文件时会出现此 FileNotFoundException?

java - 如何启用 Hibernate 查询计时以进行日志记录