Как настроить logback условно на основе имени контекста?

у меня есть три отдельных проекта, каждый со своим встроенным logback.XML-файл. Каждый из этих файлов содержит общие лесозаготовки config в доме durectory пользователя:

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

после включения, у меня есть эта спецификация:

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

это позволяет пользователю настроить свои уровни журнала и приложения и применить их в конфигурационном файле core logging.

например, в ~ / loggingConfig.xml у меня есть это строка:

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

но сотрудники, которые предпочитают консольное ведение журнала, оставляют эту строку.

проблема в том, что я хотел бы использовать разные приложения для каждого файла журнала. В других словах я хотел бы условно установить другой аппендер, на основе которого проект читает настроенный файл конфигурации.

Я понимаю, что могу настроить каждый проект для чтения файлов конфигурации с разными именами, но я хотел бы устранить беспорядок и разрешить общую конфигурацию как что ж.

2 ответов


документация немного щадит для расширенной конфигурации, но я обнаружил, что вы можете использовать имя контекста logback в качестве переменной с условным журналированием. Поэтому для каждого проекта я определяю имя пользовательского контекста в logback проектов.xml-файл:

<contextName>project1</contextName>

etc...

затем в моем ~ / loggingConfig.XML-файл я могу сделать это:

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

Это может быть немного неуклюжим, но в действительности я использую это решение, чтобы настроить свойства используются один приемщика для разных проектов, все еще имея изящный откат к значению по умолчанию для проектов, которые не имеют собственного условного блока.


в случае, если это помогает кому-либо еще, вот как я настраиваю условную конфигурацию logback со свойством, которое может содержать несколько добавителей:

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