Java日志覆盖工具

Java日志覆盖工具,java,log4j,code-coverage,Java,Log4j,Code Coverage,是否有任何工具或策略用于生成(Java、log4j)的“日志覆盖率”报告?类似于代码覆盖率,但确保没有不记录任何内容的大型方法、类或包 在编写web服务时,me团队不会编写很多日志语句。当调试运行、生产代码的实时问题时,我们总是希望我们有。不可避免地,我们试图在测试环境中通过附加调试器或添加额外的日志语句来重现bug,这可能非常困难,具体取决于所涉及的结构和交互操作 有人使用它作为代码质量度量吗?代码覆盖率需要特殊的检测,因为您试图确定生产代码是否由任何测试执行。您要问的是一个更模糊的问题,可能

是否有任何工具或策略用于生成(Java、log4j)的“日志覆盖率”报告?类似于代码覆盖率,但确保没有不记录任何内容的大型方法、类或包

在编写web服务时,me团队不会编写很多日志语句。当调试运行、生产代码的实时问题时,我们总是希望我们有。不可避免地,我们试图在测试环境中通过附加调试器或添加额外的日志语句来重现bug,这可能非常困难,具体取决于所涉及的结构和交互操作


有人使用它作为代码质量度量吗?

代码覆盖率需要特殊的检测,因为您试图确定生产代码是否由任何测试执行。您要问的是一个更模糊的问题,可能更容易(“是否为这个大型类完成了日志记录?”),也可能更难到不可能的程度(“我们是否记录了将在生产中中断的方法?”)

对于第一个问题,您可以快速编写一个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";

这只适用于小规模的项目,而且相当脆弱,但要制作一个更健壮的版本并不需要大量的工作。

大量日志可能是噪音,根据我的经验,我总是觉得通过日志进行跟踪很痛苦。话虽如此,如果日志管理良好,您可以获得良好的诊断/报告。代码未被正确测试的原因之一是生产代码中有大量日志。开发人员倾向于在开发时添加一个log语句来检查代码的工作情况,因此它鼓励不使用正确的断言编写测试。您需要的是大量经过良好测试的小类,它们组合在一起。断言应该准确地告诉您测试失败的原因


假设在您的代码路径中,您期望发生一些事情,这是它的主要责任(例如创建一个DB条目来注册用户/或某人登录),当我说它的主要责任时,我并不是说在您的代码路径中发生的副作用。如果您在主代码路径中遇到错误情况,那么如果您可以记录并将其转换为用户友好的消息,那么应该将异常一直抛出堆栈。RuntimeExceptions在这里是一个很好的例子,因为您不想捕捉这些异常,直到它一直到达视图层。也可以记录副作用,因为它们类似于信息/警告。

这听起来像是测试而不是测试错误条件的症状。生产并不是你第一个应该看到你的类崩溃的地方。@djechlin虽然我在理论上同意,但在实践中没有人编写没有bug的代码。代码完成:“不成熟的测试组织倾向于对每一个不干净的测试进行大约五次干净的测试。成熟的测试组织倾向于每一个干净的测试有五个脏的测试。该比率不会因减少清洁试验而逆转;这是通过创建25倍多的脏测试来完成的。“我认为这是一个很好的问题,并对其进行了投票,但这确实引起了我的注意,因为缺少脏测试。@djechlin嗯,很好的观点和参考,谢谢!
$ find . -name \*.java -exec perl haslog.pm {} \+