簡體   English   中英

如何在單個項目中使用多個配置和 logback?

[英]How to use multiple configurations with logback in a single project?

logback 的配置文件可以在類路徑中找到,因此是 Eclipse-project-specific,這不是我想要的。 我正在使用多個 Java 實用程序,它們都駐留在一個項目中(這共享類路徑),我需要為其中一些使用特定配置。

我已經嘗試過變量替換和 Joram 配置器,但對我沒有任何幫助。 這很可能是我的錯,我有一天會解決它,但現在我需要一個簡單的解決方案。

選項 1:使用 logback.configurationFile 系統屬性指定 logback 配置文件的位置。 這實際上允許您在每個項目中擁有多個配置文件。 根據logback 文檔,此屬性的值可以是 URL、class 路徑上的資源或應用程序外部文件的路徑。 例如:
-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}"/>
    這會導致指定的 package 默認以 DEBUG 級別登錄。
  2. 如果您想在特定應用程序中將日志記錄級別更改為 INFO,則在啟動該應用程序時將以下內容傳遞給 java:
    -Dmycompany.logging.level=INFO

選項 4:通過將系統屬性命令行參數傳遞給 java 來添加/刪除附加程序。 這將允許您登錄到不同的地方。 請注意,條件處理需要 janino 例如:

  1. 將其放入您的 logback 配置文件中,無論您放置<appender-ref>的任何位置,將ref值更改為您自己的<appender>之一,當然:
    <if condition="property("mycompany.logging.console").equalsIgnoreCase("true")"> <then><appender-ref ref="STDOUT"/></then></if>
  2. 如果要啟用此附加程序,請在啟動該應用程序時將以下內容傳遞給 java:
    -Dmycompany.logging.console=true

關於系統屬性,您將它們傳遞給 java 作為-D arguments,例如
java -Dmy.property=/path/to/config.xml com.mycompany.MyMain

在 Spring 引導應用程序中,您可以在 logback 配置文件中引用 Spring 配置文件。

這篇文章

<?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>
  ...

我使用了基於Leonidas 博客的另一個選項。 有兩個文件:

  • 包含環境屬性的可選屬性文件 (environment.properties)
  • 和自定義配置(例如 logback-env-test.xml)。 所有這些文件都必須在類路徑中。

如果屬性文件存在並定義了logEnv屬性,例如

logEnv = dev66

logback 嘗試從 logback-env- dev66中查找並包含自定義配置

<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>

否則,它將回退到默認( <else>部分)配置。 請注意, <included>標簽在自定義配置文件中使用,而不是<configuration>

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>

它將允許您對所有環境進行單獨配置,定義自己的自定義配置(例如本地開發)而不影響其他人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM