You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SBT环境下弃用packages属性后Log4j自定义插件无法发现求助

SBT 1.9.9 + Scala 2.13.9 下Log4j自定义插件自动发现失败(弃用packages属性后)

我用SBT 1.9.9(scalaVersion := "2.13.9")开发项目的自定义Log4j插件。在Log4j XML配置中指定packages="com.testserver"时插件可正常工作,但该属性已被弃用,尝试不使用它配置却失败了。

核心报错:

[info] ERROR StatusConsoleListener Appenders contains an invalid element or attribute "MetadataFileAppender"

以下是项目相关配置:

build.sbt

lazy val core = (project in file("core"))
  .settings(
    name := "core",
  )

lazy val server = (project in file("server"))
  .dependsOn(core)
  .settings(
    Compile / mainClass := Some("com.testserver.Hello"),
    libraryDependencies ++= Dependencies.log4j ++ Dependencies.allOthers,
      name := "server",
  )

lazy val root = (project in file("."))
  .dependsOn(server)
  .settings(
    Compile / run / fork := true,
    Compile / mainClass := Some("com.testserver.Hello"),
    libraryDependencies ++= Dependencies.log4j,
    javaOptions ++= Seq(
      "-Dlog4j.configurationFile=server/src/universal/conf/log4j2.xml",
    )
  )

依赖项

"org.log4s" %% "log4s" % "1.10.0",
"org.apache.logging.log4j" % "log4j-slf4j-impl" % log4jVersion,
"org.apache.logging.log4j" % "log4j-slf4j2-impl" % log4jVersion,
"org.apache.logging.log4j" % "log4j-core" % log4jVersion ,
"org.apache.logging.log4j" % "log4j-api" % log4jVersion

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration strict="true" status="info">

    <Properties>
        <Property name="logPattern" value="%d{dd-MM-yyyy HH:mm:ss.SSS} %msg%n"/>
        <Property name="logLocation" value="/tmp/logs"/>
    </Properties>
    <Appenders>
        <MetadataFileAppender name="MetadataFileAppender" foobar="test" location="${sys:logLocation}" />
        <Console name="STDOUT">
            <PatternLayout pattern="${logPattern}"/>
        </Console>
    </Appenders>

    <Loggers>
        <Root level="info">
            <AppenderRef ref="STDOUT"/>
        </Root>
    </Loggers>
</Configuration>

自定义插件代码

package com.testserver

import org.apache.logging.log4j.core.LogEvent
import org.apache.logging.log4j.core.appender.AbstractAppender
import org.apache.logging.log4j.core.config.{ Node}
import org.apache.logging.log4j.core.config.plugins.{Plugin, PluginAttribute, PluginFactory}

@Plugin(name = "MetadataFileAppender", category = Node.CATEGORY , printObject = true)
class MetadataFileAppender(name: String,  foobar: String,  location: String)
  extends AbstractAppender(name, null, null, false, Array.empty) {
  println(s"MetadataFileAppender created - my logic here ${name} ${foobar} ${location}}")
  def append(event: LogEvent): Unit = {}
}

object MetadataFileAppender {
  // Factory method to create the appender with file path and custom metadata content
  @PluginFactory
  def createAppender(
                      @PluginAttribute("name") name: String,
                      @PluginAttribute("foobar") foobar: String,
                      @PluginAttribute("location") location: String
                    ): MetadataFileAppender = {
    new MetadataFileAppender(name, foobar, location)
  }
}

问题总结

加入已弃用的packages="com.testserver"属性时插件正常工作,但需要不使用该属性的解决方案。Log4j文档提供了Gradle和Maven的插件发现配置指南,但未提及SBT的具体配置,理论上SBT无需额外配置即可生效。

已尝试的方法

  • 按照Log4j文档的标准方式配置
  • 检查依赖项和导入语句,确保Log4j依赖配置正确
  • 重构log4j2.xml,验证XML语法和属性正确性
  • 尝试调整编译器配置、引入sbt-assembly-log4j2插件等临时方案,均未解决

求SBT环境下无需使用packages属性即可启用Log4j插件自动发现的正确配置方法,或需要额外添加的SBT设置建议!

内容的提问来源于stack exchange,提问作者David Gueta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 17:54:55