【问题标题】:How to use multiple configurations with logback in a single project?如何在单个项目中使用多个配置和 logback?
【发布时间】:2011-10-05 16:27:27
【问题描述】:

logback 的配置文件在类路径中找到,因此是 Eclipse-project-specific,这不是我想要的。我正在使用多个 Java 实用程序,它们都驻留在一个项目中(这共享类路径),我需要为其中一些使用特定的配置。

我尝试了变量替换和 Joram 配置器,但对我没有任何效果。这很可能是我的错,我总有一天会解决它,但现在我需要一个简单的解决方案。

【问题讨论】:

  • 您的不同作品需要什么“具体配置”?
  • 没有什么真正“特别”的……在某些实用程序中我需要记录更多,而在其他实用程序中我需要更少记录。这对我来说是最重要的部分。我还想重定向不同文件中的输出(最好基于主类)。
  • 听起来你应该能够从一个配置文件中管理它。我不确定你的问题中的“Eclipse-project-specific”是什么意思。你能澄清一下你到底在追求什么吗?
  • @Ryan Stewart 我看不出如何从单个配置文件中管理它。有类Main1Main2。对于他们,我使用不同的记录器并且可以设置不同的记录级别。没关系。但是他们都使用Common1类,我需要根据Main*类中的哪个是主类(即启动什么程序)来设置日志记录级别。
  • @Ryan Stewart Eclipse-project-specific 我的意思是,每个 Eclipse 项目只有一个类路径,因此每个 Eclipse 项目只有一个 logback 配置文件。这很好,除非项目中有多个主要类需要不同的详细日志记录。

标签: java logging configuration logback


【解决方案1】:

选项 1:使用 logback.configurationFile 系统属性指定 logback 配置文件的位置。这实际上允许您在每个项目中拥有多个配置文件。根据logback documentation,此属性的值可以是 URL、类路径上的资源或应用程序外部文件的路径。例如:
-Dlogback.configurationFile=/path/to/config.xml

选项 2:使用变量替换来设置具有系统属性的日志文件的名称。例如:

  1. 您的 appender 可以按如下方式设置文件:
    <file>/var/tmp/${mycompany.myapplication}.log</file>
  2. 然后您可以在启动 java 时指定该变量的值:
    -Dmycompany.myapplication=SomeUtility

选项 3:使用系统属性设置记录器级别。这将允许您记录更多/更少。例如:

  1. 把这个放到你的 logback 配置文件中:
    <logger name="com.mycompany" level="${mycompany.logging.level:-DEBUG}"/>
    这会导致指定的包默认以 DEBUG 级别记录。
  2. 如果您想在特定应用程序中将日志记录级别更改为 INFO,请在启动该应用程序时将以下内容传递给 java:
    -Dmycompany.logging.level=INFO

选项4:通过将系统属性命令行参数传递给java来添加/删除附加程序。这将允许您登录到不同的地方。请注意conditional processing requires janino。例如:

  1. 将其放入您的 logback 配置文件中,无论您要放置 <appender-ref>,将 ref 值更改为您自己的 <appender>s 之一,当然:
    <if condition="property("mycompany.logging.console").equalsIgnoreCase("true")"> <then><appender-ref ref="STDOUT"/></then></if>
  2. 如果要启用此附加程序,请在启动该应用程序时将以下内容传递给 java:
    -Dmycompany.logging.console=true

关于系统属性,您将它们作为-D 参数传递给java,例如
java -Dmy.property=/path/to/config.xml com.mycompany.MyMain

【讨论】:

  • 不错的清单!另一种选择:logback 支持编程配置。如果应用程序的区别点是主类,那么这些类可以自己配置 logback。
  • 在选项 4 中,您已使用 " 开始条件,但它应该是 '
【解决方案2】:

在 Spring Boot 应用程序中,您可以在 logback 配置文件中引用 Spring Profiles。

this article

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
 <springProfile name="dev">
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
      <encoder>
        <pattern>
          %d{HH:mm:ss.SSS} | %5p | %logger{25} | %m%n
        </pattern>
        <charset>utf8</charset>
      </encoder>
    </appender>
    <root level="DEBUG">
      <appender-ref ref="CONSOLE"/>
    </root>
  </springProfile>
  ...

【讨论】:

    【解决方案3】:

    我使用了基于Leonidas blog 的另一个选项。有两个文件:

    • 包含环境属性的可选属性文件 (environment.properties)
    • 和自定义配置(例如 logback-env-test.xml)。所有这些文件都必须在类路径中。

    如果属性文件存在并定义logEnv属性例如

    logEnv = dev66
    

    logback 尝试从 logback-env-dev66.xml 中查找并包含自定义配置

    <included>
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n</pattern>
            </encoder>
        </appender>
        <root level="DEBUG">
            <appender-ref ref="STDOUT" />
        </root>
    </included>
    

    否则,它将回退到默认(&lt;else&gt; 部分)配置。请注意 &lt;included&gt; 标签在自定义配置文件中使用,而不是 &lt;configuration&gt;

    logback.xml 来管理以上所有事情:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration scan="true" scanPeriod="5 seconds" debug="true">
        <!-- To skip error if property file doesn't exist -->
        <define name="propExists" class="ch.qos.logback.core.property.ResourceExistsPropertyDefiner">
            <resource>environment.properties</resource>
        </define>
        <if condition='${propExists}'>
            <then>
                <property resource="environment.properties" />
            </then>
        </if>
        <!-- If specific configuration exists, load it otherwise fallback to default (<else> section)  -->
        <define name="confExists" class="ch.qos.logback.core.property.ResourceExistsPropertyDefiner">
            <resource>logback-env-${logEnv}.xml</resource>
        </define>
        <if condition='${confExists}'>
            <then>
                <include resource="logback-env-${logEnv}.xml"/>
            </then>
            <else>
                <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
                    <encoder>
                        <pattern>%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n</pattern>
                    </encoder>
                </appender>
                <root level="INFO">
                    <appender-ref ref="STDOUT" />
                </root>
            </else>
        </if>
    </configuration>
    

    它将允许您对所有环境进行单独配置,定义自己的自定义配置(例如本地开发)而不影响其他人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-09
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2015-09-23
      相关资源
      最近更新 更多