首页 > 解决方案 > 将 Build Id 添加到 MDC 无法正常工作

问题描述

我目前正在尝试创建一个 TeamCity 插件以将其添加到BuildIdMDC 中,然后在"teamcity-agent-log4j.xml"文件中访问它。
起初它正在工作,但后来我意识到它BuildId并不总是在所有日志中都是正确的。在前两个版本中,我有权利BuildId,但之后并不总是正确的。这是一个内部版本号为 4 的示例。它似乎保存了一些旧的 MDC,内部版本号为 3 和 2(在 INFO | 之后可见):

[2021-08-10 17:27:27,580]   INFO | 4 | Testteamcity_Build - ----------------------------------------- [ Step 'TestStep (Command Line)' (simpleRunner), Build "Testteamcity / Build" #4 {id=4, buildTypeId='Testteamcity_Build'} ] -----------------------------------------
[2021-08-10 17:27:27,582]   INFO | 4 | Testteamcity_Build - Starting "/opt/buildagent/temp/agentTmp/custom_script400763139097935001" in directory "/opt/buildagent/work/903868f2c04f952a"
[2021-08-10 17:27:27,585]   INFO | 3 | Testteamcity_Build - test
[2021-08-10 17:27:27,585]   INFO | 2 | Testteamcity_Build - Process exited with code 0

代理中的.java文件如下所示(没有导入):

public class AppAgent extends AgentLifeCycleAdapter {
    public AppAgent(EventDispatcher<AgentLifeCycleListener> events) {
        events.addListener(this);
    }

    @Override
    public void buildStarted(@NotNull AgentRunningBuild runningBuild)    {
        MDC.clear();
        MDC.put("BuildId", String.valueOf(runningBuild.getBuildId()));
        MDC.put("BuildConfigurationId", runningBuild.getBuildTypeExternalId());
    }

    @Override
    public void buildFinished(@NotNull AgentRunningBuild build, @NotNull BuildFinishedStatus buildStatus)
    {
        MDC.clear();
    }
}

"log4j.xml"以及我访问这些值的文件的一小部分:

<appender name="ROLL.BUILD" class="jetbrains.buildServer.util.TCRollingFileAppender">
    <param name="file" value="${teamcity_logs}/teamcity-build.log"/>
    <param name="maxBackupIndex" value="1"/>
    <layout class="jetbrains.buildServer.log.MessagesFilterLayout">
      <param name="ConversionPattern" value="[%d] %6p | %X{BuildId} | %X{BuildConfigurationId} - %m%n"/>
    </layout>
  </appender>

我正在清除并在 MDC 中添加新值,因此它应该可以工作,但事实并非如此。你知道我做错了什么吗?

标签: log4jteamcitymdc

解决方案


推荐阅读