envoltorios slf4j
La mayoría de las bibliotecas de registro de Scala han sido algunas envolturas alrededor de un marco de registro de Java (slf4j, log4j, etc.), pero a partir de marzo de 2015, las bibliotecas de registro sobrevivientes son todas slf4j. Estas bibliotecas de registros proporcionan algún tipo de log
objeto al que puede llamar info(...)
, debug(...)
etc. No soy un gran admirador de slf4j, pero ahora parece ser el marco de registro predominante. Aquí está la descripción de SLF4J :
Simple Logging Facade para Java o (SLF4J) sirve como una simple fachada o abstracción para varios marcos de registro, por ejemplo, java.util.logging, log4j y logback, lo que permite al usuario final conectar el marco de registro deseado en el momento de la implementación.
La capacidad de cambiar la biblioteca de registros subyacente en el momento de la implementación aporta una característica única a toda la familia de registradores slf4j, que debe tener en cuenta:
- classpath como enfoque de configuración . La forma en que slf4j sabe qué biblioteca de registro subyacente está utilizando es cargando una clase con algún nombre. He tenido problemas en los que slf4j no reconoce mi registrador cuando se ha personalizado el cargador de clases.
- Debido a que la fachada simple intenta ser el denominador común, se limita solo a las llamadas de registro reales. En otras palabras, la configuración no se puede hacer a través del código.
En un proyecto grande, en realidad podría ser conveniente poder controlar el comportamiento de registro de las dependencias transitivas si todos usaran slf4j.
Scala Logging
Scala Logging está escrito por Heiko Seeberger como sucesor de su slf4s . Utiliza macro para expandir llamadas en expresión if para evitar llamadas de registro potencialmente costosas.
Scala Logging es una biblioteca de registro conveniente y eficiente que incluye bibliotecas de registro como SLF4J y potencialmente otras.
Registradores históricos
- Logula , un contenedor Log4J escrito por Coda Hale. Solía gustarme este, pero ahora está abandonado.
- configgy , un contenedor java.util.logging que solía ser popular en los primeros días de Scala. Ahora abandonado.
Con Scala 2.10+ Considere ScalaLogging de Typesafe. Utiliza macros para entregar una API muy limpia
https://github.com/typesafehub/scala-logging
Citando de su wiki:
Después de que se haya aplicado la macro, el código se habrá transformado en el idioma descrito anteriormente.
Además, ScalaLogging ofrece el rasgo
Logging
que convenientemente proporciona unaLogger
instancia inicializada con el nombre de la clase mezclado en:fuente
class MyClass with Logging
."com.typesafe" %% "scalalogging-slf4j" % "1.1.0"
.Usar slf4j y un contenedor es bueno, pero el uso de su interpolación integrada se descompone cuando tiene que interpolar más de dos valores, desde entonces necesita crear una Matriz de valores para interpolar.
Una solución más similar a Scala es usar un thunk o cluster para retrasar la concatenación del mensaje de error. Un buen ejemplo de esto es el registrador de Lift
Log.scala Slf4jLog.scala
Que se ve así:
Tenga en cuenta que msg es una llamada por nombre y no se evaluará a menos que isTraceEnabled sea verdadero, por lo que no hay ningún costo en generar una buena cadena de mensaje. Esto funciona alrededor del mecanismo de interpolación de slf4j que requiere analizar el mensaje de error. Con este modelo, puede interpolar cualquier cantidad de valores en el mensaje de error.
Si tiene un rasgo separado que combina este Log4JLogger en su clase, entonces puede hacer
en vez de
fuente
No uses Logula
De hecho, he seguido la recomendación de Eugene y lo probé y descubrí que tiene una configuración torpe y está sujeta a errores que no se corrigen (como este ). No parece estar bien mantenido y no es compatible con Scala 2.10 .
Utilice slf4s + slf4j-simple
Beneficios clave:
-Dorg.slf4j.simplelogger.defaultlog=trace
al comando de ejecución o hardcode en el script:System.setProperty("org.slf4j.simplelogger.defaultlog", "trace")
. ¡No es necesario administrar archivos de configuración basura!Run/Debug Configurations
y añadir-Dorg.slf4j.simplelogger.defaultlog=trace
aVM options
.Esto es lo que necesita para ejecutarlo con Maven:
fuente
Así es como conseguí que Scala Logging funcionara para mí:
Pon esto en tu
build.sbt
:Luego, después de hacer un
sbt update
, esto imprime un mensaje de registro amigable:Si está utilizando la reproducción, puede, por supuesto, simplemente
import play.api.Logger
para escribir mensajes de registro:Logger.debug("Hi")
.Vea los documentos para más información.
fuente
log4j.properties
dentro de la carpeta de recursos del proyecto.Saqué un poco de trabajo del
Logging
rasgo descalax
, y creé un rasgo que también integraba unaMessageFormat-based
biblioteca.Entonces las cosas se ven así:
Nos gusta el enfoque hasta ahora.
Implementación:
fuente
Uso SLF4J + Logback classic y lo aplico así:
Luego puede usarlo según su estilo:
pero este enfoque, por supuesto, usa una instancia de registrador por instancia de clase.
fuente
Debería echar un vistazo a la biblioteca scalax: http://scalax.scalaforge.org/ En esta biblioteca, hay un rasgo de registro, usando sl4j como back-end. Al usar este rasgo, puede iniciar sesión con bastante facilidad (solo use el campo registrador en la clase que hereda el rasgo).
fuente
Writer
,Monoid
y unaMonad
implementación.fuente
Todavía no lo he probado, pero Configgy parece prometedor tanto para la configuración como para el registro:
http://github.com/robey/configgy/tree/master
fuente
Formas rápidas y fáciles.
Scala 2.10 y mayores:
Y build.sbt:
Scala 2.11+ y más reciente:
Y build.sbt:
fuente
Después de usar slf4s y logula por un tiempo, escribí
loglady
, un rasgo de registro simple que envuelve slf4j.Ofrece una API similar a la de la biblioteca de registro de Python, que hace que los casos comunes (cadena básica, formato simple) sean triviales y evita el formato repetitivo.
http://github.com/dln/loglady/
fuente
Me parece muy conveniente usar algún tipo de Java Logger, sl4j, por ejemplo, con un simple scala wrapper, lo que me brinda esa sintaxis
En mi opinión, es muy útil la combinación de marcos de registro probados de Java y la sintaxis elegante de Scala.
fuente