Jenkins控制台输出充斥着[调试] http传出日志条目

gjmwrych  于 2023-03-17  发布在  Jenkins
关注(0)|答案(2)|浏览(160)

我们有一个构建作业,其中控制台输出显示了许多奇怪的消息,如下所示,所以我们无法加载完整的日志,必须删除构建配置中的-X选项来摆脱它们。我认为这发生在我升级Jenkins版本之后。
知道是什么引起的吗

[DEBUG] http-outgoing-0 >> "j[0x5]q4/J[0x18]^di[0x86][0xbf]C_[0xd6]G[0x1d] 
[0xd4][0x7][0xf3][0xc7][0x14][0xdf][0x8d][0xe1][0x13][0xd8]$y|#[0x1e][0xbf] 
[0xe6][0x81]<[0xca][0x6][0xa1]~j[0x81]3[0xbc][0x98][0xd1][0x83][0xa7] 
[0xc5]8[0xfa]>[0xd9]edZ[0xb2][0xc][0xe0][0x5][0xab][0xf3][0x1a]M[0xb3][0xe7] 
[0x1][0xf4][\n]"
[DEBUG] http-outgoing-0 >> "[0xcd][0x9d][0x86]Zjp[0xb4][0x8d][0x87] 
[0x8f]cn[0xe7][0xab]oL.[0xb2]}[0x86][0xf8]D[0x87][0xba][0x9d][0xcc]j[0x15] 
[0xa4][0xe6]![0x9f]_BBC[0xbf]j[0xab]Rl[0x10][0x92][0xc5])[0xb2][0xc5]i[0xc2]
u5rb5r59

u5rb5r591#

我几乎在同一时间遇到了这个问题(2018年4月),并发现其由Artifactory插件2.15.0触发一年多来,我一直让这个插件降级,以避免在我的构建日志中记录调试日志。(直到上周,由于与新版本的Artifactory不兼容,我被迫升级),有可能是类路径中的不同插件或jar文件导致了您的问题。
在花了整个周末解决这个问题之后,我终于在我的构建环境中找到了根本原因。
要点是:

  • 这是构建过程(例如Ant)的类路径的问题。
  • 这不是Jenkins的配置问题。
  • 无法通过项目配置修复此问题。
  • 触发器(Jenkins或插件更新)不一定是调试日志的根本原因。
  • 当此问题被触发时,可能有多种原因,这使得此问题的故障排除变得非常困难。
    潜伏的问题

在我的例子中,DEBUG日志记录的根本原因是我的测试依赖项中有cobertura-2.1.1.jar,它包含一个logback.xml文件,还将logback-classic.jar作为依赖项引入(广泛认为这是一个错误,请参见Issue 2Issue 14Issue 36)。当在类路径中找到logback.xml文件时,覆盖Jenkins(和正在构建的项目)中的任何其他logback设置。但是,由于logback不是Apache Commons Logging(JCL)选择的日志框架,因此从未触发过此日志设置。

触发器

将Artifactory插件从2.14.0升级到2.15.0,将其日志记录从:通用日志记录-1.1.1.jarlog4j-1.2.17.jar)到:jcl-over-slf 4j-1.7.25.jarslf 4j-api-1.7.25.jar).仅供参考,log4j 1.x使用默认的根日志记录级别DEBUG,而log4j 2.x使用全局日志记录级别ERROR,这 * 可能 * 是一个完全不同的DEBUG日志记录源(但不是在我的情况下)。我的构建环境(ant)提供了log4j 2.10。0并在类路径上回登录,这只会混淆我的测试,因为根据构建过程中运行的插件,会产生不一致的结果。
当使用Artifactory插件v2.15.0+时,日志框架切换到logback,这将为cobertura-2.1.1.jar中的logback.xml文件提供权限,将根日志级别设置为DEBUG,强制构建过程的所有后续部分在DEBUG级别记录。这包括 Apache Commons HttpClient 的有线日志记录,生成http-输出-0(每个HTTP/S消息中的序列化十六进制 * 和 * 交错Base64编码内容-如您在问题中所示)。以这种方式记录JAR文件的一个PUT将使构建时间和构建日志的大小增加几个数量级(这是我在我的构建环境中所经历的),它可以很容易地削弱你的整个Jenkins服务器。这是一个巨大的问题,正如你从上面的Cobertura GitHub问题中所看到的,即使这是一个简单的修复,也没有采取任何步骤在四年内生产一个修复版本。

修正

为了解决这个问题,我不得不在Jenkins服务器上进行几处更改:

  • 将**.ant/lib文件夹中的logback-classic.jarlogback-core.jar替换为slf 4j-simple-1.7.26.jar**(这是Ant在构建和测试我的项目时使用的类路径)。此更改完全禁止在Ant中使用logback(因此类路径中的任何logback.xml文件都变得无关紧要),同时仍然允许您的构建通过SLF 4J API(通过slf 4j-simple)执行日志记录。
  • 删除对冗余日志记录版本的任何依赖项(例如,不要在类路径中同时包含commons-logging-1.1.1commons-logging-1.2)。如果使用log4j,这一点尤其重要,其中1.1版默认为DEBUG,1.2版默认为ERROR。您永远不知道JCL将选择哪个底层框架。所以你要给予它尽可能少的选择。
  • 最后,为了使测试环境与Ant环境相匹配,我调整了 * 所有 * 项目的依赖关系,* 明确排除了*logback-classic(我使用Ivy进行依赖关系解析,因此maven或gradle将使用不同的语法):
<dependency org="net.sourceforge.cobertura" name="cobertura" rev="latest.release" conf="test->default">
  <exclude org="org.apache.ant" />
  <exclude name="jaxen" />
  <exclude name="jetty" />
  <exclude name="jetty-util" />
  <exclude name="servlet-api-2.5" />
  <exclude name="logback-classic" /> <!-- IMPORTANT -->
</dependency>

作为参考,我的 broken**.ant/lib**文件夹包含以下与日志相关的jar文件(2个可能的调试日志源):

  • commons-logging-1.1.1.jar (冗余JCL版本,不确定使用了哪个版本)
  • commons-logging-1.2.jar
  • slf4j-api-1.7.21.jar (新工件插件使用的日志记录框架)
  • logback-classic-1.0.13.jar (从cobertura-2.1.1中包含的日志框架)
  • logback-core-1.0.13.jar

而我的 fixed**.ant/lib**文件夹包含以下日志jar:

  • commons-logging-1.2.jar (现在唯一可用的JCL版本)

  • slf4j-api-1.7.26.jar (现在是唯一可用的日志记录框架)

  • slf4j-simple-1.7.26.jar (现在是唯一的SLF 4J实现)

在我的固定Ant类路径中,commons-logging-1.2只能选择SLF 4J API(或JUL),并且只有一个SLF 4J实现可用(slf 4j-simple)。

TL;DR

三年来,Cobertura 2.1.1一直在告诉logback “DEBUG All the Things!",但没有人听,直到一个新版本的Artifactory插件更改了JCL版本,并沿着一个SLF 4J实现,允许logback被选为“最佳可用”日志框架。logback采纳了Cobertura的建议,在我的构建日志中加入了一个聚会,这可以通过从环境中删除logback并为JCL和SLF 4J API提供一个行为良好的日志框架(如slf 4j-simple)来防止。

tsm1rwdh

tsm1rwdh2#

所以我最近偶然发现了这个问题,在我的案例中,这是由于在构建阶段在maven中设置了**-X**标志。有人设置了这个标志,但忘记删除它。这是一个老问题,但也许这个信息对某些人有用。

相关问题