我正在为我的服务器设计一种日志记录机制,其中每个用户都有自己的日志文件夹,以他们的员工 ID 命名,每个文件夹中的日志文件以日期命名。为了实现这一点,我被建议使用 Log4j
<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)
我尝试研究
<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
我尝试将架构更改为不同版本,但到目前为止没有任何效果。我应该忽略该消息吗?模式验证重要吗?非常感谢你
我尝试将架构更改为不同版本,但到目前为止没有任何效果。我应该忽略该消息吗?模式验证重要吗?
Log4j Core 的配置是schema-less,因此您可以忽略验证错误。
https://logging.apache.org/xml/ns
中提供的模式由名为 Log4j Docgen 的内部工具在每个版本中自动生成,并涵盖 Log4j Core 配置的基本功能。
高级功能,例如:
要么无法用 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);