Scala上的以下代码输出return java 11 instance。我使用的是openjdk-11和sbt1.8.0。第一个出现此输出的原因是什么?如何在使用Breeze的项目中避免出现此输出?此外,这个问题会在其他版本的jdk中重现,此代码总是打印构建它的java版本。
return java 11 instance
ycl3bljg1#
问题是,对于密集矩阵的乘法,Breeze使用https://github.com/luhenry/netlib和记录器dev.ludovic.netlib.blas.InstanceBuilderhttps://github.com/luhenry/netlib/blob/master/blas/src/main/java/dev/ludovic/netlib/blas/InstanceBuilder.java
dev.ludovic.netlib.blas.InstanceBuilder
private static JavaBLAS initializeJava() { String[] fullVersion = System.getProperty("java.version").split("[+.\\-]+", 2); int major = Integer.parseInt(fullVersion[0]); if (major >= 16) { try { System.out.println("trying to return java 16 instance"); return VectorBLAS.getInstance(); } catch (Throwable t) { log.warning("Failed to load implementation from:" + VectorBLAS.class.getName()); } } if (major >= 11) { System.out.println("return java 11 instance"); return Java11BLAS.getInstance(); } else { System.out.println("return java 8 instance"); return Java8BLAS.getInstance(); } }
使用setLevel可以关闭所有其他日志记录
setLevel
import java.util.logging.{Level, Logger} val logger = Logger.getLogger("dev.ludovic.netlib.blas.InstanceBuilder") logger.log(Level.SEVERE, "AAAA!!!") // prints logger.setLevel(Level.OFF) logger.log(Level.SEVERE, "BBBB!!!") // doesn't print
Is there a way to disable java.util.logging and enable it back later?Why are the Level.FINE logging messages not showing?但是return java...消息不是用log/doLog打印的,而是直接用类InstanceBuilder的静态初始化块中的System.out.println打印的,所以这是在类InstanceBuilder的初始化期间执行的。静态初始化块只能通过字节码操作(Javassist、Byte Buddy)进行修改Over riding the static block of a class in java所以最简单的方法就是修改打印流
return java...
log
doLog
InstanceBuilder
System.out.println
System.setOut(new java.io.PrintStream(System.out) { override def println(s: String): Unit = if (Seq("trying to return java", "return java").forall(!s.startsWith(_))) super.println(s) })
https://scastie.scala-lang.org/DmytroMitin/gk52bU4iSEebHAZPZKhaDw/5
7y4bm7vi2#
顺便说一下,这个问题在netlib的最新版本中已经解决了https://github.com/scalanlp/breeze/issues/849
2条答案
按热度按时间ycl3bljg1#
问题是,对于密集矩阵的乘法,Breeze使用https://github.com/luhenry/netlib和记录器
dev.ludovic.netlib.blas.InstanceBuilder
https://github.com/luhenry/netlib/blob/master/blas/src/main/java/dev/ludovic/netlib/blas/InstanceBuilder.java
使用
setLevel
可以关闭所有其他日志记录Is there a way to disable java.util.logging and enable it back later?
Why are the Level.FINE logging messages not showing?
但是
return java...
消息不是用log
/doLog
打印的,而是直接用类InstanceBuilder
的静态初始化块中的System.out.println
打印的,所以这是在类InstanceBuilder
的初始化期间执行的。静态初始化块只能通过字节码操作(Javassist、Byte Buddy)进行修改
Over riding the static block of a class in java
所以最简单的方法就是修改打印流
https://scastie.scala-lang.org/DmytroMitin/gk52bU4iSEebHAZPZKhaDw/5
7y4bm7vi2#
顺便说一下,这个问题在netlib的最新版本中已经解决了
https://github.com/scalanlp/breeze/issues/849