1

有没有什么很酷的技巧可以让单一logback.xml配置改变 PROD 与在 IDE 中运行?

我想根据我是在我的 IDE 中运行还是在 jar 中的 PROD 中运行来使用不同的附加程序、模式和日志级别。

我目前在中使用 2 个不同的文件src/main/resources:logback.xml(在 PROD/jar 中使用)和 logback-dev.xml,在我的 IDE 中运行时使用。不理想的部分是每个开发人员都必须配置他们的 IDE 启动器以包含-Dlogback.configurationFile=path/to/logback-dev.xml. 换句话说,它在 git clone 之后不能开箱即用。我还试图避免在我的 VCS 中提交特定于 IDE 的启动器

我看到了<if>构造,但我不确定我可以使用什么条件来检测 IDE。if条件似乎非常严格:

条件是一个 Java 表达式,其中只能访问上下文属性或系统属性

我也尝试使用logback-test.xmlinsrc/test/resouces但这仅适用于单元测试,并且在正常启动应用程序时它不会被 maven 复制到类路径

如果有任何用处,我正在使用 IntelliJ、maven 和 git

4

1 回答 1

0

您可以使用 JUnit 从 IDE 中启动您的应用程序,这将导致logback-test.xml参与。您可以将此“测试”类命名为MyAppToolie 之类的名称,后缀会阻止 Surefire 将其作为测试执行。或者使用标签和配置文件从您的标准测试套件调用中排除这个“测试”用例。例如:

public class MyAppTool {
  @Test
  public void runMyApp() {
    // invoke a 'main' class or however you run your app
  }
}

这基本上是一种“在我的 VCS 中提交特定于 IDE 的启动器”的方式,所以如果这绝对不是运行器,那么另一种方法是使用<if>构造,但使用默认情况下true用于 IDE 调用和falsePROD 调用的条件. 这将允许您使用单个logback.xml默认行为,即开发人员可以从他们的 IDE 启动您的应用程序,而无需创建自定义启动器。以下示例假定这logs.dir是一个在 PROD 模式下运行应用程序时始终存在的 JVM 参数:

<if condition='isNull("logs.dir")'>
  <then>
    <!-- in-IDE appenders -->
  </then>
  <else>
    <!-- standard appenders -->
  </else>
</if>

无论您如何执行此操作,您都必须提供某种在 IDE 中运行/不在 IDE 中运行的指令,因此这实际上是哪种指令形式最适合您的使用的问题。

于 2018-08-21T07:44:37.913 回答