Может ли log4j наследовать xml из элемента base/root?

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

Спасибо!

Ответ 1

AFAIK нет никакого "нативного" механизма наследования, но вы можете добиться того же результата, используя объект для ссылки и включить внешний XML-фрагмент (см. эта nabble thread). Если вы просто хотите изменить некоторые свойства, аналогичное решение описывается здесь. Пример использования внешних объектов:

Основная конфигурация (log4j.xml):

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" [
    <!ENTITY appender SYSTEM "appender.xml">
    <!ENTITY root SYSTEM "root.xml">
]>  
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" >
&appender;
&root;
</log4j:configuration>

appender.xml:

<?xml version="1.0" encoding="UTF-8"?>
<appender name="MyAppender" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="datePattern" value="'.'yyyy-MM-dd_HH-mm" />
    <param name="file" value="logs/MyLogFile.log" />
    <param name="Append" value="true" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{ISO8601} %-5p [%t] %c: %m%n" />
    </layout>
</appender>

root.xml:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <priority value="INFO" />
    <appender-ref ref="MyAppender" />
</root>

Он работает даже в том случае, если определение root и appender помещается в файл single без xml pi. Таким образом, внешний контент может даже быть некорректным XML-фрагментом без единого корневого элемента. Это позволяет переносить конфигурацию log4j полной в один внешний файл:

log4j.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"[
    <!ENTITY config SYSTEM "log4j-config.txt">
]>
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" >
&config;
</log4j:configuration>

log4j-config.txt:

<appender name="MyAppender" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="datePattern" value="'.'yyyy-MM-dd_HH-mm" />
    <param name="file" value="logs/MyLogFile.log" />
    <param name="Append" value="true" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{ISO8601} %-5p [%t] %c: %m%n" />
    </layout>
</appender>
<root>
    <priority value="INFO" />
    <appender-ref ref="MyAppender" />
</root>

Если вам нужно адаптировать конфигурацию log4j индивидуально и гибко, вы можете попробовать и объединить файл root.xml с child.xml с помощью XSLT или XmlMerge (часть el4j), чтобы создать конфигурацию на лету, и подайте org.apache.log4j.xml.DOMConfigurator с итоговой DOM.

Ответ 2

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