Java log4j2未从MDC获取Syslog Appender的新值
我使用以下方法配置了log4j2:Java log4j2未从MDC获取Syslog Appender的新值,java,spring-boot,logging,log4j2,Java,Spring Boot,Logging,Log4j2,我使用以下方法配置了log4j2: <Routing name="RoutingRemote"> <Routes pattern="$${ctx:syslogAdded}"> <Route key="true"> <Syslog name="syslog-${ctx:host}" format="${ctx:log
<Routing name="RoutingRemote">
<Routes pattern="$${ctx:syslogAdded}">
<Route key="true">
<Syslog name="syslog-${ctx:host}" format="${ctx:logFormat}"
host="${ctx:host}" port="${ctx:port}"
protocol="${ctx:protocol}" appName="appname"
mdcId="mdc-id" />
</Route>
</Routes>
</Routing>
我可以在后端选择更新Syslog服务器的详细信息,比如IP、端口、日志格式、协议
我面临的问题是,当我为Syslog添加值时,log4j2始终保留我第一次输入的初始值,并将日志推送到我第一次输入的Syslog服务器。
我使用调试检查了新值是否被放入MDC中,但没有反映到log4j2中。
同样的设置也适用于logback,但现在我需要使用log4j2。
这里会出现什么问题?
MDC
用于以线程方式存储信息并在日志消息中打印该信息
但是,在这里,您使用MDC
进行appender初始化,这不是一种好的推荐方法
在正常情况下,appender在应用程序启动期间初始化。因此,在本例中,appender也在应用程序的开始处初始化,然后使用MDC
输入一些值,因此如果要使用这些值,必须重新初始化log4j2配置
将值放入MDC
后,在代码行下方添加以重新初始化log4j-
((org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false)).reconfigure();
嗨,谢谢你的回答。我已经尝试过这种方法,但是在这种情况下,我在第一次之后没有得到任何日志。我的用例是,在每个新请求上,我必须从某个对象读取值并决定Syslog的属性。但是,Appender不用于此目的。Appender是一种静态的,您只需定义一次,然后在应用程序生命周期中永远使用它们,最好在log4j配置文件中定义所有syslog Appender及其实际配置,然后使用路由条件在特定syslog Appender中路由日志消息。该用例使用户将提供syslog server的详细信息,用户可以随时更改这些详细信息。同一用例,我们已经使用logback实现了,并且运行良好。现在出于某些原因,我们需要使用log4j2并实现相同的用例。