Log4j2 配置 XML 模式不允许 <Route></Route> 块接受嵌套元素

问题描述 投票:0回答:1

我正在为我的服务器设计一种日志记录机制,其中每个用户都有自己的日志文件夹,以他们的员工 ID 命名,每个文件夹中的日志文件以日期命名。为了实现这一点,我被建议使用 Log4j 机制。然而,即使我已经按照文档所述记下了所有内容,XML 编辑器 (Visual Studio Code) 仍然说 块不接受嵌套文档。以下是我的xml配置:

<Configuration xmlns="https://logging.apache.org/xml/ns"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="https://logging.apache.org/xml/ns https://logging.apache.org/xml/ns/log4j-config-2.xsd"
               status="WARN">
               <Appenders>

                    <Routing name="AppAppender">
                        <Routes pattern="$${ctx:employeeId}">
                            <Route>
                                <RollingFile name="EmployeeLogAppender" fileName="${baseLogDir}/${ctx:employeeId}/log-${date:yyyy-MM-dd}.log"
                                        filePattern="${baseLogDir}/${ctx:employeeId}/archive/log-%d{yyyy-MM-dd-HH-mm}.log">
                                    <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n" />
                                    <Policies>
                                            <SizeBasedTriggeringPolicy size="10MB" />
                                    </Policies>
                                </RollingFile>
                            </Route>
                        </Routes>
                    </Routing>

                    <Routing name="WebAppender">
                        <Routes pattern="$${ctx:layer}">
                            <Route>
                                <RollingFile name="CustomerLogAppender" fileName="${baseLogDir}/${ctx:employeeId}/log-${date:yyyy-MM-dd}.log"
                                        filePattern="${baseLogDir}/archive/%d{yyyy-MM-dd-HH-mm}/${ctx:layer}.log">
                                    <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n" />
                                    <Policies>
                                        <SizeBasedTriggeringPolicy size="10MB" />
                                    </Policies>
                                </RollingFile>
                            </Route>
                        </Routes>
                    </Routing>

               </Appenders>
               <Loggers>

                    <Logger name="com.example.main.Controller">
                        <AppenderRef ref="AppAppender"></AppenderRef>
                        <AppenderRef ref="WebAppender"></AppenderRef>
                    </Logger>

                    <Logger name="com.example.main.Service">
                        <AppenderRef ref="AppAppender"></AppenderRef>
                        <AppenderRef ref="WebAppender"></AppenderRef>
                    </Logger>

                    <Logger name="org.springframework.data.mongodb">
                        <AppenderRef ref="AppAppender"></AppenderRef>
                        <AppenderRef ref="WebAppender"></AppenderRef>
                    </Logger>

                    <Logger name="org.mongodb.driver">
                        <AppenderRef ref="AppAppender"></AppenderRef>
                        <AppenderRef ref="WebAppender"></AppenderRef>
                    </Logger>

               </Loggers>
</Configuration>

以下是VSC显示的错误信息:

cvc-complex-type.2.1: Element 'Route' must have no character or element information item [children], because the type's content type is empty.xml(cvc-complex-type.2.1)

我尝试研究 元素的架构。根据架构,元素只能包含 ref 和 key 属性:

<complexType name="org.apache.logging.log4j.core.appender.routing.Route">
<annotation>
<documentation>A Route to an appender.</documentation>
</annotation>
<attribute name="key" type="string">
<annotation>
<documentation>The key.</documentation>
</annotation>
</attribute>
<attribute name="ref" type="string">
<annotation>
<documentation>The Appender reference.</documentation>
</annotation>
</attribute>
</complexType>

但是,这是文档中提到的:

如果选择了路由,则

Route
元素确定要使用的附加程序。附加器可以是:

  • 之前声明的附加程序,来自配置文件的

    Appenders
    部分

  • 当路由变为活动状态时,基于嵌套附加程序定义实例化的新附加程序。

我尝试将架构更改为不同版本,但到目前为止没有任何效果。我应该忽略该消息吗?模式验证重要吗?非常感谢你

xml log4j log4j2
1个回答
0
投票

我尝试将架构更改为不同版本,但到目前为止没有任何效果。我应该忽略该消息吗?模式验证重要吗?

Log4j Core 的配置是schema-less,因此您可以忽略验证错误。

https://logging.apache.org/xml/ns
中提供的模式由名为 Log4j Docgen 的内部工具在每个版本中自动生成,并涵盖 Log4j Core 配置的基本功能。

高级功能,例如:

  • 属性替换,允许您放置
    ${...}
    占位符而不是配置属性的值。
  • Arbiters,允许您根据外部变量预处理配置树。
  • 惰性节点,例如

要么无法用 XSD 模式来表达,要么 Log4j Docgen 工具不知道如何表达它们。 XSD 架构也无法识别第三方 Log4j 插件。

Log4j Docgen 基本上是一个高级注释处理器,它可以为

<Route>
插件提取的唯一信息是它具有
ref
key
属性以及一些尚未解析的内容:

@PluginFactory
public static Route createRoute(
        @PluginAttribute("ref") final String appenderRef,
        @PluginAttribute("key") final String key,
        @PluginNode final Node node);
© www.soinside.com 2019 - 2024. All rights reserved.