wrappers slf4j
La plupart des bibliothèques de journalisation de Scala ont été des wrappers autour d'un framework de journalisation Java (slf4j, log4j, etc.), mais en mars 2015, les bibliothèques de journaux survivantes sont toutes slf4j. Ces bibliothèques de journaux fournissent une sorte d' log
objet auquel vous pouvez appeler info(...)
, debug(...)
etc. Je ne suis pas un grand fan de slf4j, mais il semble maintenant être le cadre de journalisation prédominant. Voici la description de SLF4J :
La façade de journalisation simple pour Java ou (SLF4J) sert de simple façade ou abstraction pour divers cadres de journalisation, par exemple java.util.logging, log4j et logback, permettant à l'utilisateur final de se connecter au cadre de journalisation souhaité au moment du déploiement.
La possibilité de modifier la bibliothèque de journaux sous-jacente au moment du déploiement apporte une caractéristique unique à toute la famille de loggers slf4j, dont vous devez être conscient:
- classpath comme approche de configuration . La façon dont slf4j sait quelle bibliothèque de journalisation sous-jacente vous utilisez consiste à charger une classe par un nom. J'ai eu des problèmes dans lesquels slf4j ne reconnaissait pas mon enregistreur lorsque le chargeur de classe était personnalisé.
- Parce que la façade simple essaie d'être le dénominateur commun, elle est limitée uniquement aux appels de journaux réels. En d'autres termes, la configuration ne peut pas se faire via le code.
Dans un grand projet, il pourrait en fait être pratique de pouvoir contrôler le comportement de journalisation des dépendances transitives si tout le monde utilisait slf4j.
Journalisation Scala
Scala Logging est écrit par Heiko Seeberger comme successeur de ses slf4s . Il utilise une macro pour développer les appels dans l'expression if afin d'éviter un appel de journal potentiellement coûteux.
Scala Logging est une bibliothèque de journalisation pratique et performante qui englobe des bibliothèques de journalisation comme SLF4J et potentiellement d'autres.
Enregistreurs historiques
- Logula , un wrapper Log4J écrit par Coda Hale. J'aimais bien celui-ci, mais maintenant il est abandonné.
- configgy , un wrapper java.util.logging qui était populaire dans les premiers jours de Scala. Maintenant abandonné.
Avec Scala 2.10+, pensez à ScalaLogging de Typesafe. Utilise des macros pour fournir une API très propre
https://github.com/typesafehub/scala-logging
Citant leur wiki:
Une fois la macro appliquée, le code aura été transformé dans l'idiome décrit ci-dessus.
De plus, ScalaLogging offre le trait
Logging
qui fournit commodément uneLogger
instance initialisée avec le nom de la classe mélangée dans:la source
class MyClass with Logging
."com.typesafe" %% "scalalogging-slf4j" % "1.1.0"
.Utiliser slf4j et un wrapper est bien mais l'utilisation de son interpolation intégrée se décompose lorsque vous avez plus de deux valeurs à interpoler, car vous devez créer un tableau de valeurs à interpoler.
Une solution plus Scala consiste à utiliser un thunk ou un cluster pour retarder la concaténation du message d'erreur. Un bon exemple de ceci est l'enregistreur de Lift
Log.scala Slf4jLog.scala
Ce qui ressemble à ceci:
Notez que msg est un appel par nom et ne sera pas évalué à moins que isTraceEnabled soit vrai, il n'y a donc aucun coût à générer une belle chaîne de message. Cela fonctionne autour du mécanisme d'interpolation de slf4j qui nécessite l'analyse du message d'erreur. Avec ce modèle, vous pouvez interpoler n'importe quel nombre de valeurs dans le message d'erreur.
Si vous avez un trait distinct qui mélange ce Log4JLogger dans votre classe, vous pouvez faire
au lieu de
la source
N'utilisez pas Logula
J'ai en fait suivi la recommandation d'Eugene et l'ai essayé et j'ai découvert qu'il avait une configuration maladroite et qu'il était soumis à des bogues, qui ne sont pas corrigés (comme celui-ci ). Il ne semble pas être bien entretenu et il ne prend pas en charge Scala 2.10 .
Utilisez slf4s + slf4j-simple
Avantages clés:
-Dorg.slf4j.simplelogger.defaultlog=trace
à commander ou hardcode exécution dans votre script:System.setProperty("org.slf4j.simplelogger.defaultlog", "trace")
. Pas besoin de gérer les fichiers de configuration trash!Run/Debug Configurations
et d'ajouter-Dorg.slf4j.simplelogger.defaultlog=trace
àVM options
.Voici ce dont vous avez besoin pour l'exécuter avec Maven:
la source
Voici comment j'ai fait fonctionner Scala Logging pour moi:
Mettez ceci dans votre
build.sbt
:Ensuite, après avoir fait une
sbt update
, ceci imprime un message de journal convivial:Si vous utilisez Play, vous pouvez bien sûr simplement
import play.api.Logger
pour écrire des messages du journal:Logger.debug("Hi")
.Consultez la documentation pour plus d'informations.
la source
log4j.properties
dossier de ressources du projet.J'ai tiré un peu de travail du
Logging
trait descalax
, et créé un trait qui a également intégré uneMessageFormat-based
bibliothèque.Ensuite, les choses ressemblent à ceci:
Nous aimons l'approche jusqu'à présent.
La mise en oeuvre:
la source
J'utilise SLF4J + Logback classic et je l'applique comme ceci:
Ensuite, vous pouvez l'utiliser selon ce qui correspond le mieux à votre style:
mais cette approche utilise bien sûr une instance de journalisation par instance de classe.
la source
Vous devriez jeter un œil à la bibliothèque scalax: http://scalax.scalaforge.org/ Dans cette bibliothèque, il y a un trait Logging, utilisant sl4j comme backend. En utilisant ce trait, vous pouvez vous connecter assez facilement (utilisez simplement le champ logger dans la classe héritant du trait).
la source
Writer
,Monoid
et uneMonad
mise en œuvre.la source
Je ne l'ai pas encore essayé, mais Configgy semble prometteur pour la configuration et la journalisation:
http://github.com/robey/configgy/tree/master
la source
Formulaires rapides et faciles.
Scala 2.10 et plus ancien:
Et build.sbt:
Scala 2.11+ et plus récent:
Et build.sbt:
la source
Après avoir utilisé slf4s et logula pendant un certain temps, j'ai écrit
loglady
, un trait de journalisation simple enveloppant slf4j.Il propose une API similaire à celle de la bibliothèque de journalisation de Python, ce qui rend les cas courants (chaîne de base, formatage simple) triviaux et évite le formatage standard.
http://github.com/dln/loglady/
la source
Je trouve très pratique d'utiliser une sorte de java logger, sl4j par exemple, avec un simple wrapper scala, ce qui m'apporte une telle syntaxe
À mon avis, un mélange très utile de frameworks de journalisation éprouvés en Java et de la syntaxe sophistiquée de scala.
la source