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

8 浏览
0 Comments

自动检测错误的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 );

结果,旧的Example.class仍然存在,因此错误地出现在日志中(从而导致很多头疼)。

我发现这种类型的配置错误有点奇怪,但它确实可能发生,我们目前的主要问题不是它可能发生,而是我们必须修复配置错误的记录器。

我们如何自动检测这些问题?(修复可以手动进行,但我想找到一种方法来查找所有配置错误的类)。

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

  1. 对于每个.java文件
  2. 查找每个"class XXX"
  3. 解析接下来的'x'行(比如20行)
  4. 是否有Logger.getLogger(...)行?
  5. 如果是,则是否与"class XXX"匹配?
  6. 如果不匹配,则报告

假阳性并不是问题,所以如果有一些错误的"class XXX"被解析也没有关系。

注意:问题确实是我们现在有20万行代码,我们希望自动检测违规情况(修复可以手动进行),所以这个问题与以下问题不同:

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

实际上,这可能更像是一个Bash问题而不是一个Java问题 🙂

非常感谢您的任何帮助。

0
0 Comments

问题的出现原因:log4j静态初始化错误的检测是一个困难的任务。通过使用AspectJ,可以编织Logger.getLogger方法,以确定参数Example.class是否等于当前类的名称。通过使用new Exception().getStackTrace()[0].getClassName()可以在程序中动态获取当前类的名称。

解决方法:使用AspectJ对Logger.getLogger方法进行编织,以检测参数是否与当前类的名称相匹配。这样可以自动检测错误的log4j静态初始化。

0
0 Comments

问题出现的原因:

问题的根本原因是在一个200,000行的代码库中,存在log4j静态初始化的错误。这种错误会导致应用程序在运行时出现问题。问题的核心在于无法手动逐行检查代码并找出所有可能存在问题的地方。

解决方法:

为了自动检测这些log4j静态初始化错误,可以采取以下方法之一:

1. 使用静态代码分析工具:可以使用静态代码分析工具(例如FindBugs、PMD、Checkstyle等)来扫描代码库,并查找可能存在的log4j静态初始化错误。这些工具可以通过识别潜在的代码问题和常见错误模式来帮助开发人员找到问题所在。

2. 编写自定义脚本:可以编写自定义脚本来扫描代码库并查找可能存在的log4j静态初始化错误。这可以通过使用正则表达式或特定的代码搜索模式来实现。脚本可以遍历代码库的所有文件,并在每个文件中搜索log4j静态初始化的问题。

3. 使用IDE插件:某些集成开发环境(IDE)提供了插件或扩展,可以帮助开发人员自动检测log4j静态初始化错误。这些插件可以在开发过程中实时检测代码,并提供警告或建议修复错误。

解决log4j静态初始化错误的方法可以是使用静态代码分析工具、编写自定义脚本或使用IDE插件。这些方法都可以自动检测代码库中可能存在的问题,并提供解决问题的建议。通过自动化的方式,可以减少手动检查代码的工作量,并提高代码质量和可靠性。

0
0 Comments

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

问题原因:在使用log4j进行静态初始化时,可能会出现错误。解决方法是使用工厂调用替换初始Logger声明,并在导入语句下方导入工厂。

解决方法:

1. 备份代码。

2. 在命令行中运行以下命令来自动替换Logger声明并导入工厂:

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' \
    {} \;

3. 修改上述命令,以排除不需要修改的文件夹,例如.svn文件夹。

4. 确保在尝试此方法之前进行了适当的备份,并准备重新编译代码。

5. 最好拥有具有广泛代码覆盖率的测试套件来自动运行。

这种方法可能会有一些问题,但通过进行一些修改,可以实现自动检测和修复log4j静态初始化错误。

0