java - 用于检查调试/跟踪日志记录级别的 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;
}
}
}
如果有人可以帮助我,我将不胜感激!
解决方案
推荐阅读
- dialogflow-cx - Dialogflow CX - 如何让 sys.no-input-1 重复而不是转到 sys.no-input-default
- php - PHP在创建对象时从数组中获取对象
- reactjs - 如何加载组件中的所有 url,并且 onclick 应该使用特定于所选项目的状态变量填充表?
- java - XSD 双重绑定到 BigDecimal
- signature - 椭圆曲线数字签名格式
- c# - 带有标签页的 Xamarin 表单在每个标签页中都有数据表单输入页面
- git - 如何更改 Azure DevOps 主机 Git Repo 的默认分支名称
- swift - SwiftUI 在按钮内获取 SF 图像
- python - ZeroDivisionError 即使在使用 try 和 except 之后
- error-handling - 如果没有结果,则从 for 循环返回结果或不返回任何内容