【问题标题】:log4j2 not picking up new values for Syslog Appender from MDClog4j2 没有从 MDC 获取 Syslog Appender 的新值
【发布时间】:2020-10-28 05:26:46
【问题描述】:

我已经使用以下配置了 log4j2:


<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。 这可能是什么问题?

【问题讨论】:

    标签: java spring-boot logging log4j2


    【解决方案1】:

    MDC 用于以线程方式存储信息并在日志消息中打印该信息。

    但是,在这里,您使用 MDC 进行附加程序初始化,这不是一个好的和推荐的方法。

    在正常情况下,appender 在应用程序启动期间被初始化。因此,在这种情况下,appender 也会在应用程序启动时初始化,然后您使用 MDC 放置一些值,因此如果您想使用这些值,则必须重新初始化 log4j2 配置。

    将值放入MDC 后,添加以下代码行以重新初始化log4j -

    ((org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false)).reconfigure();
    

    【讨论】:

    • 您好,感谢您的回答。我已经尝试过这种方法,但在这种情况下,第一次之后我没有得到任何日志。我的用例是,对于每个新请求,我都必须从某个对象中读取值并确定 Syslog 的属性。
    • 您想更改每个请求的附加程序配置。但是,附加程序不用于此目的。 Appender 是一种静态的,你定义它们一次,然后在你的应用程序生命周期中永远使用它们。
    • 如果您知道所有 syslog appender 的配置,最好在 log4j 配置文件中定义所有 syslog appender 及其实际配置,然后使用路由条件在特定 syslog appender 中路由您的日志消息
    • 用例是这样的,用户将提供 Syslog 服务器的详细信息,并且用户可以多次更改这些详细信息。
    • 同样的用例,我们已经使用 logback 实现了,它运行良好。现在由于某些原因,我们需要使用 log4j2 并实现相同的用例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多