Как настроить 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>