2013-04-09 13 views
6

Mam trzy oddzielne projekty, każdy z własnym osadzonym plikiem logback.xml. Każdy z tych plików zawiera plik konfiguracyjny wspólny zalogowaniu domu durectory użytkownika:Jak skonfigurować warunkowanie zwrotne warunkowo na podstawie nazwy kontekstu?

<include file="${user_home}/loggingConfig.xml"/> 

Po to, mam specyfikacji:

<root level="error"> 
    <appender-ref ref="${appender:-console}" /> 
</root> 

To pozwala użytkownikowi na skonfigurowanie ich poziom dziennika i appenders i mają je zastosowane przez główny plik konfiguracyjny rejestrowania.

Na przykład, w ~/loggingConfig.xml mam ten wiersz:

<property name="appender" value="file" /> 

Ale współpracownicy, którzy wolą urlopu rejestrowania konsola, że ​​linia na zewnątrz.

Problem polega na tym, że chciałbym użyć różnych aplikacji dla każdego pliku dziennika. Innymi słowy, chciałbym warunkowo ustawić innego aplikanta, na podstawie którego projekt czyta dostosowany plik konfiguracyjny.

Zdaję sobie sprawę, że mógłbym skonfigurować każdy projekt tak, aby czytał pliki konfiguracyjne o różnych nazwach, ale chciałbym wyeliminować bałagan i umożliwić również współdzieloną konfigurację.

Odpowiedz

9

Dokumentacja jest nieco zapasowa dla zaawansowanej konfiguracji, ale odkryłem, że można użyć nazwy kontekstu logback jako zmiennej z protokołowaniem warunkowym. Więc dla każdego projektu I zdefiniować nazwę kontekstu zwyczaj w pliku projekty logback.xml:

<contextName>project1</contextName> 

etc ...

Wtedy w moim pliku ~/loggingConfig.xml mogę to zrobić:

<property name="appender" value="file" /> 

<!--if condition='property("CONTEXT_NAME").equalsIgnoreCase("project1")'> 
    <then> 
     <property name="appender" value="file" /> 
    </then> 
</if--> 
<if condition='property("CONTEXT_NAME").equalsIgnoreCase("project2")'> 
    <then> 
     <property name="appender" value="console" /> 
    </then> 
</if> 
<if condition='property("CONTEXT_NAME").equalsIgnoreCase("project3")'> 
    <then> 
     <property name="appender" value="file" /> 
    </then> 
</if> 

Może to być trochę niezgrabne, ale w rzeczywistości używam tego rozwiązania do konfigurowania właściwości używanych przez jednego programistę dla różnych projektów, zachowując jednocześnie wdzięczny powrót do wartości domyślnej dla projektów, które nie mają własnego blok warunkowy.

4

W przypadku pomaga nikomu, to w jaki sposób skonfigurować warunkowe konfiguracji logback z nieruchomości, która może zawierać wiele appenders:

<root level="${logback.loglevel}"> 
    <if condition='isDefined("logback.appenders")'> 
     <then> 
      <if condition='property("logback.appenders").contains("CONSOLE")'> 
       <then> 
        <appender-ref ref="CONSOLE"/> 
       </then> 
      </if> 
      <if condition='property("logback.appenders").contains("FILE")'> 
       <then> 
        <appender-ref ref="FILE"/> 
       </then> 
      </if> 
      <if condition='property("logback.appenders").contains("GELF")'> 
       <then> 
        <appender-ref ref="GELF"/> 
       </then> 
      </if> 
     </then> 
     <else> 
      <appender-ref ref="CONSOLE"/> 
     </else> 
    </if> 
</root> 
Powiązane problemy