2013-02-22 5 views
0

J'utilise le package breeze.optimize de Scala Breeze, et il semble que Breeze ahs ait implémenté sa propre bibliothèque de journalisation.Comment configurer Scala Breeze pour utiliser log4j ou slf4j

Y a-t-il un moyen de configurer Breeze pour utiliser la journalisation standard comme log4j ou slf4j afin de pouvoir configurer la journalisation pour les optimisations de la même manière que pour tout le reste de mon application?

Sinon, comment puis-je simplement désactiver les messages de journalisation. Ils sont activés par défaut et enregistrent chaque itération d'une minimisation de fonction pour moi, ce qui génère beaucoup de bruit de log pour moi.

Wrapper pour Apache Commons basé en Ontario, il réponse ci-dessous:

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 
} 

J'ai pu utiliser cela comme:

val lbfgs = new LBFGS[Mat](maxIters, 5, tolerance) { 
    override val log = new BreezeCommonsLogger[LBFGS[Mat]] 
} 

Répondre

1

Remarquez comment les classes d'optimisation ont une variable membre log qui est de type breeze.util.logging.Logger. Pour désactiver les messages de journalisation, il existe une classe fournie appelée breeze.util.logging.NullLogger. Pour remplacer la valeur par défaut log, vous pouvez faire quelque chose comme ceci:

val opt = new breeze.optimize.OWLQN { 
    override val log = breeze.util.logging.NullLogger 
} 

Cela va créer une classe anonyme qui conserve tout de même pour l'optimiseur OWLQN, sans l'enregistrement. En termes d'utilisation d'une source de journalisation alternative comme log4j ou slf4j, essayez d'utiliser des conversions implicites pour convertir les loggers de log4j en loggers Breeze, ou cherchez à encapsuler un logger dans une classe qui hérite de Logger.

+0

Cela a fonctionné, à la fois en désactivant NullLogger et en utilisant la même approche pour configurer la journalisation sur une source de journal différente. Éditera ma question pour inclure la classe wrapper. –

Questions connexes