2017-01-03 2 views
3

У меня есть logback.xml вне моего упакованного .WAR, что я должен использовать для INFO & ERROR конфигурации каротажа - и никаких изменений не могут быть сделаны к нему. [отредактировал: возможно, будет возможно добавить или что-то подобное минимальное]
Цель Я бы хотел настроить регистрацию отладки таким образом, чтобы каждый модуль имел свой собственный .log-файл и т. д. t добавьте эту конфигурацию в существующий файл logback.xml, как указано выше. [edit in] Кроме того, мне нужен способ включения отладки только для конкретного модуля - возможно, через «мой» добавленный logback.xmlЕсть ли способ настроить logback из двух отдельных файлов logback.xml на уровень журнала?

Как получить логин для чтения только конфигурации отладки из другого XML-файла?

Edited добавить файлы примеров:

главная/ака неизменна logback.xml

<?xml version="1.0" encoding="UTF-8"?> 

<property scope="system" name="component-name" value="COMPONENT_A" /> 
<property file="$configuration.yaml" /> 
<property scope="context" name="enable-all-log" value="false" /> 

    <property name="default-log-pattern" 
    value="%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{uuid}|%X{instanceID}|%thread||%X{userId}|%level /> 

<!-- All log --> 
<if condition='property("enable-all-log").equalsIgnoreCase("true")'> 
    <then> 
     <appender name="ALL_ROLLING" 
      class="ch.qos.logback.core.rolling.RollingFileAppender"> 
      <file>${log.home}/${component-name}/${subcomponent-name}/all.log 
      </file> 

      <rollingPolicy 
       class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> 
       <fileNamePattern>${log.home}/${component-name}/${subcomponent-name}/all.log.%i 
       </fileNamePattern> 
       <minIndex>1</minIndex> 
       <maxIndex>10</maxIndex> 
      </rollingPolicy> 

      <triggeringPolicy 
       class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
       <maxFileSize>20MB</maxFileSize> 
      </triggeringPolicy> 
      <encoder> 
       <pattern>${default-log-pattern}</pattern> 
      </encoder> 
     </appender> 

     <appender name="ASYNC_ALL" class="ch.qos.logback.classic.AsyncAppender"> 
      <appender-ref ref="ALL_ROLLING" /> 
     </appender> 
    </then> 
</if> 

<!-- Error log --> 
<appender name="ERROR_ROLLING" 
    class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <file>${log.home}/${component-name}/${subcomponent-name}/error.log 
    </file> 

    <!-- Audit messages filter - deny audit messages --> 
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> 
     <evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator"> 
      <marker>AUDIT_MARKER</marker> 
     </evaluator> 
     <onMismatch>NEUTRAL</onMismatch> 
     <onMatch>DENY</onMatch> 
    </filter> 
<!-- Debug log --> 
<appender name="DEBUG_ROLLING" 
    class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <file>${log.home}/${component-name}/${subcomponent-name}/debug.log 
    </file> 


    <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> 
     <evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator"> 
      <marker>TRANSACTION_MARKER</marker> 
     </evaluator> 
     <onMismatch>NEUTRAL</onMismatch> 
     <onMatch>DENY</onMatch> 
    </filter> 

    <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> 
     <evaluator class="ch.qos.logback.classic.boolex.GEventEvaluator"> 
      <expression> 
       e.level.toInt() &lt;= DEBUG.toInt() 
      </expression> 
     </evaluator> 
     <OnMismatch>DENY</OnMismatch> 
     <OnMatch>NEUTRAL</OnMatch> 
    </filter> 

    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> 
     <fileNamePattern>${log.home}/${component-name}/${subcomponent-name}/debug.log.%i 
     </fileNamePattern> 
     <minIndex>1</minIndex> 
     <maxIndex>10</maxIndex> 
    </rollingPolicy> 

    <triggeringPolicy 
     class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
     <maxFileSize>20MB</maxFileSize> 
    </triggeringPolicy> 
    <encoder> 
     <pattern>${default-log-pattern}</pattern> 
    </encoder> 
</appender> 

<root level="INFO"> 
    <appender-ref ref="ASYNC_ERROR" /> 
    <appender-ref ref="ASYNC_DEBUG" /> 
    <if condition='property("enable-all-log").equalsIgnoreCase("true")'> 
     <then> 
      <appender-ref ref="ALL_ROLLING" /> 
     </then> 
    </if> 
</root> 

<logger name="foo.bar" level="INFO" /> 

+0

Что вы имеете в виду * никакие изменения не могут быть сделаны к нему whatsover *? – NewUser

+0

Вы попробовали * include * files? – Jobin

+0

@NewUser Я имею в виду, что он не может быть изменен, потому что он принадлежит к другой группе (введите здесь неактуальную политику), а для INFO + ERROR их конфигурация просто прекрасна. Дело в том, что они внедрили ведение журнала отладки таким образом, что мы не хотим следовать, и я не могу добавить конфигурацию регистраторов DEBUG в существующий logback.xml – akapulko2020

ответ

3

Вы можете использовать механизм Logback fileInclusion.

Из документации:

Joran поддерживает в том числе части конфигурационного файла из другого файла. Это делается путем объявления элемента.

Если вы не знаете, Joran - это компонент, на который опирается Logback. У вас нет дополнительной библиотеки для добавления.
Однако вы должны остерегаться уникальных элементов, которые не должны дублироваться, как, например, корневой элемент.

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

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

Ваш новый файл конфигурации может выглядеть так:

<configuration> 

    <include file="pathToActualConfigFile/logback.xml"/> 
    <!-- don't specify root element or other unique elements --> 
    ... 
</configuration> 

Здесь ссылка на сайт Logback: http://logback.qos.ch/manual/configuration.html#fileInclusion


EDIT: помочь О.П. о том, как сделать это Работа.

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

1) Поскольку вы можете включить новый файл конфигурации ведения журнала из фактической конфигурации журнала, это уже хорошо. Единственная связь, в которой вы нуждаетесь, включает ресурс/файл/url в корневой конфигурации xml.

В документации указано, что у вас есть 3 способа указания включений. Вот помните:


Содержание включить можно ссылаться как файл, как ресурс, или как URL.

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

В качестве ресурса:

Чтобы включить ресурс, то есть файл найден на пути класса, используйте атрибут ресурсов.

<include resource="includedConfig.xml"/> 

Как URL:

Чтобы включить содержимое URL с помощью атрибута URL.


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

... 
<include resource="other-logback-debug_product_a.xml"/> 
<include resource="other-logback-debug_product_b.xml"/> 
... 

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

2) В включенных источниках вы должны указать аддитивность на false (что по умолчанию является истинным) для всех регистраторов, поскольку, по-моему, вы не хотите, чтобы журналы отладки дублировались в приложениях предка ,

Вот пример прилагаемого файла конфигурации, в котором он определяет файл-приложение с именем FILE_DEBUG_KIOSK_PRODUCT.
Он также определяет регистратор для пакета com.product.kiosk.area с уровнем регистрации в DEBUG и прикрепляет к нему приложение.
Я сварил, начиная с одного из appenders Опубликованная (я удалил не соответствующие части):

<?xml version="1.0" encoding="UTF-8"?> 

<included> 

    <!-- Debug log --> 
    <appender name="FILE_DEBUG_KIOSK_PRODUCT" 
     class="ch.qos.logback.core.rolling.RollingFileAppender"> 

     <file>${debug.kiosk.product.dir}/debug.log</file> 

     <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> 
      <fileNamePattern>${log.home}/${component-name}/${subcomponent-name}/debug.log.%i 
      </fileNamePattern> 
      <minIndex>1</minIndex> 
      <maxIndex>10</maxIndex> 
     </rollingPolicy> 

     <triggeringPolicy 
      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
      <maxFileSize>20MB</maxFileSize> 
     </triggeringPolicy> 
     <encoder> 
      <pattern>${default-log-pattern}</pattern> 
     </encoder> 
    </appender> 

    <logger name="com.product.kiosk.area" level="DEBUG" additivity="false"> 
     <appender-ref ref="FILE_DEBUG_KIOSK_PRODUCT" /> 
    </logger> 

</included> 
+0

Awesome, спасибо! – akapulko2020

+0

Добро пожаловать. Если вы столкнулись с некоторыми интересными вещами, не стесняйтесь давать обратную связь :) – davidxxx

+0

Как бы установить уровень журнала в DEBUG, учитывая эту настройку? Если я не должен включать корневой элемент? Кроме того, файл, на который ссылается во включении, должен иметь все его элементы внутри , правильно? Кажется, что для меня лучше было бы включить новый файл в существующую, не может быть измененную (возможно, это изменение), а не наоборот, но я не знаю, как установить уровень журнала, который нужно отлаживать:/ – akapulko2020

Смежные вопросы