首页 > 解决方案 > 用于检查调试/跟踪日志记录级别的 SonarQube Java 规则

问题描述

我正在尝试编写自定义的 java 规则来检查是否启用了调试/跟踪日志级别。如果忘记了日志级别检查,则规则应报告问题。

import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;

public class CheckDebugAndTraceLevel {
    
    private static final Log LOG = LogFactory.getLog(CheckDebugAndTraceLevel.class);

    void foo()
    { 
        if(LOG.isDebugEnabled()) 
        { 
            LOG.debug("some debug text.."); 
        } 
        LOG.debug("some debug text.."); // Noncompliant {{ check LOG.debug with an if statement}}
        
        if(LOG.isTraceEnabled()) 
        { 
            LOG.trace("some debug text.."); 
        } 
        LOG.trace("some text.."); // Noncompliant {{ check LOG.trace with an if statement}}
    } 
}

我用记录器测试了我的规则,并从我的示例类中收到了“Log.debug”和“Log.trace”。不过,我在执行 jUnit 测试时遇到断言错误。

public class DebugAndTraceRule extends BaseTreeVisitor implements JavaFileScanner {

private JavaFileScannerContext context;
private boolean logFlag = false;

@Override
public void scanFile(JavaFileScannerContext context) {
    this.context = context;
    scan(context.getTree());
}

@Override
public void visitMethod(MethodTree tree) {
    super.visitMethod(tree);

    String logOption;
    for (StatementTree statement : tree.block().body()) {
        if (statement.is(Kind.EXPRESSION_STATEMENT)) {
            logOption = statement.firstToken().text() + ".";
            //System.out.println(statement);

            ExpressionStatementTreeImpl eStatement = (ExpressionStatementTreeImpl) statement;
            MethodInvocationTreeImpl methodInvoc = (MethodInvocationTreeImpl) eStatement.expression();
            MemberSelectExpressionTreeImpl memberSel = (MemberSelectExpressionTreeImpl) methodInvoc.methodSelect();
            logOption += memberSel.identifier();

            // check logOption
            if (logFlag && (logOption.equals("LOG.debug") || logOption.equals("LOG.trace"))) {
                //System.out.println(logOption + " - line:" + statement.firstToken().line());
                context.reportIssue(this, tree, "debug/trace levels of your logger must be enabled!");
            }
        }
    }
}

@Override
public void visitVariable(VariableTree tree) {
    super.visitVariable(tree);

    if (tree.type().symbolType().toString().equals("Log")) {
        logFlag = true;
    }
}

}

如果有人可以帮助我,我将不胜感激!

断言错误

标签: javaif-statementloggingsonarquberules

解决方案


推荐阅读