gpt4 book ai didi

scala - SBT 在多项目构建中添加项目 ID 以登录

转载 作者:行者123 更新时间:2023-12-01 01:47:05 24 4
gpt4 key购买 nike

在 SBT 多项目构建中,当您在聚合器项目上运行任务并且它在每个聚合子项目中运行任务时,来自每个子项目的所有日志都会在一个大流中一起输出。

这使得在多项目构建中调试构建问题变得很困难,因为所有日志都混合在一起。有没有办法在每个日志行输出projectID,以便您快速识别日志来自哪个子项目?

这是一个示例项目:

name := "my-multiproject-build"

lazy val ProjectOne = project
lazy val ProjectTwo = project

lazy val root = project.in( file(".") ).aggregate(ProjectOne, ProjectTwo)

(默认情况下会发生什么)
sbt package
[info] Packaging ProjectOne.jar ...
[info] Done packaging.
[info] Packaging ProjectTwo.jar ...
[info] Done packaging.

(我想要的是)
sbt package
[info] [ProjectOne] Packaging ProjectOne.jar ...
[info] [ProjectOne] Done packaging.
[info] [ProjectTwo] Packaging ProjectTwo.jar ...
[info] [ProjectTwo] Done packaging.

我试着调查 SBT custom loggers ,但不幸的是文档有点稀疏,我绝不是 SBT 专家。

最佳答案

就像 Rich 说的,目前没有自定义 sbt 的日志格式的扩展点。但是如果你不介意依赖内部 API,你可以接近你想要的,这取决于你使用的 sbt 版本。

基本上你必须替换默认的 logManager而不是添加 extraLoggers (虽然 API 类似)。

sbt 0.13.x

我们在这里的工作看起来更简单。我们可以重复使用BufferedLogger避免将所有内容委托(delegate)给 ConsoleLogger 所涉及的样板文件:

  logManager := LogManager.withScreenLogger { (_, state) =>
val console = ConsoleLogger(state.globalLogging.console)
new BufferedLogger(console) {
val project = projectID.value.name
override def log(level: Level.Value, message: => String): Unit =
console.log(level, s"[$project] $message")
}
}

sbt 1.0.x

此处更改了日志记录 API 以提供 event logging .我们现在必须提供一个 log4j Appender这更灵活,但使我们的工作更加困难。我们不能重用 sbt.internal 中的类日志实现已经移动,因为它们都是私有(private)的、密封的、最终的等。我唯一能想到的就是没有复制 ConsoleAppender 的功能是破解输出流:
   logManager := LogManager.defaultManager(
ConsoleOut.printStreamOut(new PrintStream(System.out) {
val project = projectID.value.name
override def println(str: String): Unit = {
val (lvl, msg) = str.span(_ != ']')
super.println(s"$lvl] [$project$msg")
}
}))

请注意,不保证 println将被调用而不是其他一些 print方法。

我不知道是否可以使用 log4j 配置文件来自定义格式。

关于scala - SBT 在多项目构建中添加项目 ID 以登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47758078/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com