Может ли log4j наследовать xml от базового / корневого элемента? - PullRequest
11 голосов
/ 25 мая 2011

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

Спасибо!

Ответы [ 2 ]

8 голосов
/ 08 июня 2011

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

Основная конфигурация (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>

Это работает даже в том случае, если корень и определение appender помещены в один файл без? Xml pi. Таким образом, внешний контент может быть даже плохо сформированным фрагментом XML, в котором отсутствует один корневой элемент. Это позволяет перенести complete log4j config в отдельный внешний файл :

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.

4 голосов
/ 03 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...