Scala使用logback-classic遇IllegalAccessError及日志方法调用异常
解决Scala中使用logback-classic的报错问题
核心错误原因
你遇到的IllegalAccessError是因为错误导入了JDK内部模块的com.sun.org.slf4j.internal.LoggerFactory,这个类属于Java的java.xml.crypto模块,该模块不会对外暴露这个包给非模块化应用,导致无法访问。同时logger.info()报错也是因为这个内部类的Logger实现不包含标准SLF4J的全部方法。
分步解决方案
1. 修正build.sbt依赖配置
当前logback-classic被标记为Test作用域,主代码无法访问到该依赖,需要移除% Test:
ThisBuild / version := "0.1.0-SNAPSHOT" ThisBuild / scalaVersion := "2.13.8" libraryDependencies ++= Seq( "com.typesafe.akka" %% "akka-actor" % "2.6.3", "ch.qos.logback" % "logback-classic" % "1.4.4" // 移除% Test,让主代码可以使用 ) lazy val root = (project in file(".")) .settings( name := "logBack" )
2. 修正Scala代码的Logger导入
替换JDK内部的LoggerFactory为标准SLF4J API的实现:
import org.slf4j.LoggerFactory // 标准SLF4J导入 object logPractice extends App{ val logger = LoggerFactory.getLogger(this.getClass) logger.debug("Asif") logger.info("Info level message") // 现在可以正常使用info方法 logger.error("Invalid Query") }
3. 修正logback.xml配置错误
配置文件中interpretlogger引用了不存在的Interpret appender,需要删除该引用或者添加对应的appender。这里先删除无效的appender-ref:
<configuration> <appender name="logBack" class="ch.qos.logback.core.FileAppender"> <File>/tmp/logBack.log</File> <encoder> <pattern>%d{HH:mm:ss.SSS} %r [%thread] %logger{0} %level - %msg%n</pattern> </encoder> </appender> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} %r [%thread] %logger{0} %level - %msg%n</pattern> </encoder> </appender> <logger name="interpretlogger" level="debug" additivity="false"> <appender-ref ref="STDOUT"/> <!-- 移除无效的<appender-ref ref="Interpret"/> --> </logger> <root level="debug"> <appender-ref ref="logBack"/> <appender-ref ref="STDOUT"/> </root> </configuration>
验证修复
完成以上修改后,重新运行代码,应该可以正常输出日志到控制台和指定文件,logger.info()也能正常调用。
内容的提问来源于stack exchange,提问作者Asif khAn
相关产品推荐
相关产品推荐

