我没有找到排除它的通用解决方案,但如果您的代码库允许您这样做,您可以将日志记录语句包装在带有包含“的注释的方法中”生成“在它的名字中。
一个简单的例子:
package org.example.logging
import groovy.transform.Generated
import groovy.util.logging.Slf4j
@Slf4j
class Greeter {
void greet(name) {
logDebug("called greet for ${name}")
println "Hello, ${name}!"
}
@Generated
private logDebug(message) {
log.debug message
}
}
很遗憾javax.annotation.Generated
不合适,因为它只保留了SOURCE
,因此我(被)使用groovy.transform.Generated
在这里,但可以轻松地为此目的创建您自己的注释。
我在这里找到了该解决方案:如何添加注释以从 jacoco 代码覆盖率报告中排除方法? https://stackoverflow.com/questions/47824761/how-would-i-add-an-annotation-to-exclude-a-method-from-a-jacoco-code-coverage-re
更新:在 Groovy 中,您可以通过以下特征最优雅地解决它:
package org.example.logging
import groovy.transform.Generated
import groovy.util.logging.Slf4j
@Slf4j
trait LoggingTrait {
@Generated
void logDebug(String message) {
log.debug message
}
}
...进而...
package org.example.logging
import groovy.util.logging.Slf4j
@Slf4j
class Greeter implements LoggingTrait {
void greet(name) {
logDebug "called greet for ${name}"
println "Hello, ${name}!"
}
}
不幸的是该物业log
被解释为属性Greeter
,不属于LoggingTrait
,所以你必须附加@Slf4j
到特征和实现该特征的类。
尽管如此,这样做还是会为您提供预期的记录器 - 实现类之一:
14:25:09.932 [main] DEBUG org.example.logging.Greeter - called greet for world