(请注意,它更像是 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 脚本将非常受欢迎。
- 对于每个 .java 文件
- 找到每个“类 XXX”
- 解析接下来的“x”行(比如 20 行)
- 是否有 Logger.getLogger(...) 行?
- 如果是,它是否与“XXX 类”匹配?
- 如果没有报告
误报不是问题,因此如果解析了一些伪造的“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/