1

我想使用ArchUnit来强制使用SLF4J 日志框架并避免简单的System.out调用。此外,我想避免使用任何其他日志记录框架。我该如何实施这样的检查?

目前我写这个测试

class EnforceSlf4JLoggingTest {

    private final JavaClasses importedClasses = new ClassFileImporter()
            .withImportOption(new ImportOption.DoNotIncludeTests())
            .importPackages("... my packages ...");

    @Test
    public void classesShouldNotUseJavaUtilLogging() {
        NO_CLASSES_SHOULD_USE_JAVA_UTIL_LOGGING.check(importedClasses);
    }

    @Test
    public void classesShouldNotUseSystemOutLogging() {
        noClasses()
                .should()
                .dependOnClassesThat()
                .belongToAnyOf(java.lang.System.class)
                .because("use SLF4J instead")
                .check(importedClasses);
    }
}

但它实际上并没有强制使用 SLF4J,而只是限制java.unit.logging使用并防止对java.lang.System类有依赖性(实际System.out常量所在的位置)。

我的情况是否更优雅的解决方案?

4

1 回答 1

0

没有一种简单的方法可以避免使用除 SLF4J 之外的任何其他 loggig 系统,但可以使用这个 ArchUnit 检查模板

ArchRuleDefinition.noClasses()
  .should().dependOnClassesThat()
  .resideInAnyPackage(
    "java.util.logging..", 
    "org.apache.logging.."
  ).as("Please only depend on SLF4J as a logging framework");

在该部分resideInAnyPackage中应指定必须避免使用不同日志系统的包。

还有,规

com.tngtech.archunit.library.GeneralCodingRules.NO_CLASSES_SHOULD_ACCESS_STANDARD_STREAMS 

必须用于检查是否缺少任何 plain和System.out调用代码。System.errprintStackTrace

于 2021-03-16T16:27:44.960 回答