Я пытаюсь уменьшить дублирование в моей конфигурации log4j и хотел знать, могу ли я направить аналогичную конфигурацию до файла root.xml и наследовать ее в каждом из файлов log4j.xml для детей?
Спасибо!
Я пытаюсь уменьшить дублирование в моей конфигурации log4j и хотел знать, могу ли я направить аналогичную конфигурацию до файла root.xml и наследовать ее в каждом из файлов log4j.xml для детей?
Спасибо!
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.
Я сомневаюсь, что это возможно в log4j, но сам по себе проект-преемник logback по крайней мере предоставляет возможность включить конфигурации. Это не наследование, а также стратегия сокращения дублирования. Возможно, вы можете попробовать.