问题 log4j可以从base / root元素继承xml吗?


我正在尝试减少我的log4j配置中的重复,并想知道我是否可以将类似的配置推送到root.xml文件并从每个子log4j.xml文件中继承它?

谢谢!


6069
2018-05-24 20:01


起源



答案:


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定义都放入a中,它甚至可以工作  文件,没有?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配置,您可以尝试使用XSLT将root.xml与child.xml合并或 XmlMerge(el4j的一部分) 动态创建配置,并提供 org.apache.log4j.xml.DOMConfigurator 与结果DOM。


8
2018-06-08 09:10



从我所看到的外部片段是非常有限的;只能使用像appender路径这样的文字。像添加新记录器这样的东西似乎是不可能的。到目前为止,这仍是最好的答案。 - bbaja42
@ bbaja42:我添加了两个应该可行的示例 - 我认为应该可以将完整的xml片段放在单独的文件中并使用实体包含它们。 - tohuwawohu
做得好。 +1和赏金。 :d - bbaja42


答案:


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定义都放入a中,它甚至可以工作  文件,没有?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配置,您可以尝试使用XSLT将root.xml与child.xml合并或 XmlMerge(el4j的一部分) 动态创建配置,并提供 org.apache.log4j.xml.DOMConfigurator 与结果DOM。


8
2018-06-08 09:10



从我所看到的外部片段是非常有限的;只能使用像appender路径这样的文字。像添加新记录器这样的东西似乎是不可能的。到目前为止,这仍是最好的答案。 - bbaja42
@ bbaja42:我添加了两个应该可行的示例 - 我认为应该可以将完整的xml片段放在单独的文件中并使用实体包含它们。 - tohuwawohu
做得好。 +1和赏金。 :d - bbaja42


我怀疑它在log4j中是可能的,而是自我命名的后继项目 的logback 至少提供了一种可能性 包括 配置。它不是遗传,而是减少重复的策略。也许你可以尝试一下。


4
2018-06-03 15:00