是否有任何工具或策略可以在(Java、log4j)上生成“日志覆盖率”报告?就像代码覆盖率一样,但要确保没有不记录任何内容的大型方法、类或包。
在编写 Web 服务时,我的团队不会编写很多日志语句。当调试运行中的实时问题时,生产代码,我们总是希望我们有。我们不可避免地会尝试在我们的测试环境中通过附加调试器或添加额外的日志语句来重现错误,这可能非常困难,具体取决于所涉及的结构和互操作。
有人将其用作代码质量指标吗?
是否有任何工具或策略可以在(Java、log4j)上生成“日志覆盖率”报告?就像代码覆盖率一样,但要确保没有不记录任何内容的大型方法、类或包。
在编写 Web 服务时,我的团队不会编写很多日志语句。当调试运行中的实时问题时,生产代码,我们总是希望我们有。我们不可避免地会尝试在我们的测试环境中通过附加调试器或添加额外的日志语句来重现错误,这可能非常困难,具体取决于所涉及的结构和互操作。
有人将其用作代码质量指标吗?
代码覆盖率需要特殊的检测,因为您试图找出一段生产代码是否被任何测试执行。你要问的有点模糊,可能更容易(“是否为这个大类完成了任何日志记录?”)或者更难到不可能的地步(“我们是否记录了将在生产中中断的方法?”)。
对于第一个问题,您可以快速编写一个 shell 脚本来完成这项工作。例如,这是 Perl 中的一个骨架。在这里,我假设我们正在使用 SLF4J,并且看到“LoggerFactory”的导入足以证明存在记录器。
while ($filename = shift) {
open my $in, "<$filename";
my $loc = 0;
my $log = "NO LOGGER";
while (<$in>) {
$loc++;
if (m/import org.slf4j.LoggerFactory/) {
$log = "has logger";
}
}
print "$filename : $loc LOC $log\n";
$total{$log} += $loc;
}
print "\n\nTOTAL LOGGED: $total{'has logger'}\nTOTAL UNLOGGED: $total{'NO LOGGER'}\n";
我可以从我的 shell 运行它来运行一个小项目中的所有 Java 文件
$ find . -name \*.java -exec perl haslog.pm {} \+
这仅适用于小型项目,并且相当脆弱,但制作更强大的版本并不是一件容易的事。
许多日志可能是噪音,根据我的经验,我总是发现通过日志进行跟踪很痛苦。话虽如此,如果日志管理得当,您可以获得良好的诊断/报告。代码未正确测试的原因之一是生产代码中有大量日志。开发人员倾向于在开发时添加一条日志语句以检查代码是否有效,因此它鼓励不要使用正确的断言编写测试。您需要的是许多经过良好测试的小类组合在一起。断言应该准确地告诉您测试失败的原因。
假设在您的代码路径中,您期望发生一些事情,这是它的主要职责(例如,创建了一个数据库条目来注册用户/或登录的人),当我说它的主要职责时,我不是在谈论发生在你的代码路径。如果您在主代码路径中有错误情况,则应将异常一直抛出堆栈,您可以记录并将其转换为用户友好的消息。RuntimeExceptions 在这里很好,因为您不希望捕获这些异常,直到它一直到视图层。也可以记录副作用,因为它们就像信息/警告。