【问题标题】:Can log4j inherit xml from a base/root element?log4j 可以从基本/根元素继承 xml 吗?
【发布时间】:2011-05-24 20:01:05
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: xml inheritance log4j


    【解决方案1】:

    AFAIK 没有“本机”继承机制,但您可以使用实体引用并包含外部 xml 片段来实现相同的结果(请参阅this nabble thread)。如果您只想修改某些属性,here 描述了类似的解决方案。使用外部实体的示例:

    主配置(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>
    

    如果根和附加程序定义都放在一个 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 配置,您可以尝试使用 XSLT 或 XmlMerge (part of el4j) 将 root.xml 与 child.xml 合并以动态创建配置,并提供 @ 987654324@ 与生成的 DOM。

    【讨论】:

    • 据我所知外部片段非常有限;只能使用像 appender 的路径这样的文字。添加新记录器之类的东西似乎是不可能的。到目前为止,这仍然是最好的答案。
    • @bbaja42:我添加了两个应该可以工作的示例 - 我认为应该可以将完整的 xml 片段放在单独的文件中并使用实体包含它们。
    【解决方案2】:

    我怀疑在 log4j 中是否可行,但自命名的后继项目 logback 至少为 include 配置提供了可能性。这不是继承,而是减少重复的策略。也许你可以试一试。

    【讨论】:

      猜你喜欢
      • 2014-10-02
      • 2012-08-20
      • 1970-01-01
      • 2018-02-08
      • 1970-01-01
      • 1970-01-01
      • 2018-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多