我使用的是Scala Breeze的breeze.optimize
包,看起来Breeze已经实现了自己的日志库。
有没有一种方法可以将Breeze配置为使用log4j或slf4j等标准日志记录,这样我就可以像配置应用程序中的其他日志记录一样配置日志记录以进行优化?
或者,我如何关闭日志消息。默认情况下,它们是打开的,并记录函数最小化的每一次迭代,这对我来说产生了很多日志噪声
基于以下答案的Apache Commons包装器:
import breeze.util.logging.Logger
import breeze.util.logging.Logger.Level
import org.apache.commons.logging.LogFactory
class BreezeCommonsLogger[T: ClassManifest] extends Logger {
private val log = LogFactory.getLog(classManifest[T].erasure)
def trace(f: => Any) { if (log.isTraceEnabled()) log.trace(f.toString) }
def debug(f: => Any) { if (log.isDebugEnabled()) log.debug(f.toString) }
def info(f: => Any) { if (log.isInfoEnabled()) log.info(f.toString) }
def warn(f: => Any) { if (log.isWarnEnabled()) log.warn(f.toString) }
def error(f: => Any) { if (log.isErrorEnabled()) log.error(f.toString) }
def fatal(f: => Any) { if (log.isFatalEnabled()) log.fatal(f.toString) }
def level_=(level: Level) {}
def level = Logger.NEVER
}
我可以像这样使用:
val lbfgs = new LBFGS[Mat](maxIters, 5, tolerance) {
override val log = new BreezeCommonsLogger[LBFGS[Mat]]
}
请注意优化类如何具有类型为breeze.util.logging.Logger
的log
成员变量。为了关闭日志记录消息,提供了一个名为breeze.util.logging.NullLogger
的类。要覆盖默认的log
,可以执行以下操作:
val opt = new breeze.optimize.OWLQN {
override val log = breeze.util.logging.NullLogger
}
这将创建一个匿名类,使OWLQN
优化器的所有内容保持不变,而不记录日志。
在使用log4j或slf4j等替代日志记录源方面,请尝试使用隐式转换将log4j记录器转换为Breeze记录器,或者考虑将记录器封装在继承自Logger
的类中。