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
相关产品推荐
相关产品推荐

