Was ist ein guter Weg, um sich in einer Scala-Anwendung anzumelden? Etwas, das mit der Sprachphilosophie übereinstimmt, den Code nicht überladen und wartungsarm und unauffällig ist. Hier ist eine grundlegende Anforderungsliste:
- einfach
- macht den Code nicht unübersichtlich. Scala ist großartig für seine Kürze. Ich möchte nicht, dass die Hälfte meines Codes Anweisungen protokolliert
- Das Protokollformat kann an den Rest meiner Unternehmensprotokolle und Überwachungssoftware angepasst werden
- unterstützt Protokollierungsstufen (dh Debug, Trace, Fehler)
- kann sich auf der Festplatte sowie an anderen Zielen (z. B. Socket, Konsole usw.) anmelden.
- Mindestkonfiguration, falls vorhanden
- funktioniert in Containern (dh Webserver)
- (optional, aber schön zu haben) kommt entweder als Teil der Sprache oder als Maven-Artefakt, sodass ich meine Builds nicht hacken muss, um es zu verwenden
Ich weiß, dass ich die vorhandenen Java-Protokollierungslösungen verwenden kann, aber sie schlagen bei mindestens zwei der oben genannten Probleme fehl, nämlich Unordnung und Konfiguration.
Vielen Dank für Ihre Antworten.
Bei Scala 2.10+ sollten Sie ScalaLogging von Typesafe in Betracht ziehen. Verwendet Makros, um eine sehr saubere API bereitzustellen
https://github.com/typesafehub/scala-logging
Zitat aus ihrem Wiki:
Nachdem das Makro angewendet wurde, wurde der Code in das oben beschriebene Idiom umgewandelt.
Zusätzlich bietet ScalaLogging das Merkmal,
Logging
das bequem eineLogger
Instanz bereitstellt, die mit dem Namen der Klasse initialisiert ist, gemischt in:quelle
class MyClass with Logging
."com.typesafe" %% "scalalogging-slf4j" % "1.1.0"
.Die Verwendung von slf4j und eines Wrappers ist nett, aber die Verwendung der integrierten Interpolation bricht zusammen, wenn Sie mehr als zwei Werte interpolieren müssen. Seitdem müssen Sie ein Array von Werten zum Interpolieren erstellen.
Eine Scala-ähnliche Lösung besteht darin, einen Thunk oder Cluster zu verwenden, um die Verkettung der Fehlermeldung zu verzögern. Ein gutes Beispiel dafür ist der Logger von Lift
Log.scala Slf4jLog.scala
Welches sieht so aus:
Beachten Sie, dass msg ein Call-by-Name ist und nur ausgewertet wird, wenn isTraceEnabled true ist, sodass das Generieren einer netten Nachrichtenzeichenfolge keine Kosten verursacht. Dies umgeht den Interpolationsmechanismus des slf4j, der das Parsen der Fehlermeldung erfordert. Mit diesem Modell können Sie eine beliebige Anzahl von Werten in die Fehlermeldung interpolieren.
Wenn Sie ein separates Merkmal haben, das diesen Log4JLogger in Ihre Klasse mischt, können Sie dies tun
anstatt
quelle
Benutze Logula nicht
Ich bin tatsächlich der Empfehlung von Eugene gefolgt und habe es ausprobiert und festgestellt, dass es eine ungeschickte Konfiguration hat und Fehlern ausgesetzt ist, die nicht behoben werden (wie dieser ). Es scheint nicht gut gewartet zu sein und unterstützt Scala 2.10 nicht .
Verwenden Sie slf4s + slf4j-simple
Hauptvorteile:
-Dorg.slf4j.simplelogger.defaultlog=trace
Ausführungsbefehls oder eines Hardcodes in Ihrem Skript festlegen können :System.setProperty("org.slf4j.simplelogger.defaultlog", "trace")
. Keine Notwendigkeit, trashige Konfigurationsdateien zu verwalten!Run/Debug Configurations
und fügen Sie-Dorg.slf4j.simplelogger.defaultlog=trace
zuVM options
.Folgendes müssen Sie tun, um es mit Maven auszuführen:
quelle
So habe ich Scala Logging für mich arbeiten lassen:
Tragen Sie dies in Ihre
build.sbt
:Anschließend
sbt update
wird eine freundliche Protokollnachricht ausgedruckt:Wenn Sie Play verwenden, können Sie natürlich einfach
import play.api.Logger
Protokollnachrichten schreiben :Logger.debug("Hi")
.Weitere Informationen finden Sie in den Dokumenten .
quelle
log4j.properties
im Projektressourcenordner erstellt hatte .Ich habe ein bisschen Arbeit aus dem
Logging
Merkmal gezogenscalax
und ein Merkmal erstellt, das auch eineMessageFormat-based
Bibliothek integriert .Dann sieht das so aus:
Wir mögen den Ansatz bisher.
Implementierung:
quelle
Ich benutze SLF4J + Logback classic und wende es folgendermaßen an:
Dann können Sie es verwenden, je nachdem, was besser zu Ihrem Stil passt:
Bei diesem Ansatz wird natürlich eine Logger-Instanz pro Klasseninstanz verwendet.
quelle
Sie sollten sich die Scalax-Bibliothek ansehen: http://scalax.scalaforge.org/ In dieser Bibliothek gibt es ein Protokollierungsmerkmal, bei dem sl4j als Backend verwendet wird. Mit diesem Merkmal können Sie ganz einfach protokollieren (verwenden Sie einfach das Logger-Feld in der Klasse, die das Merkmal erbt).
quelle
Writer
,Monoid
Und eineMonad
Umsetzung.quelle
Ich habe es noch nicht ausprobiert, aber Configgy sieht sowohl für die Konfiguration als auch für die Protokollierung vielversprechend aus:
http://github.com/robey/configgy/tree/master
quelle
Schnelle und einfache Formulare.
Scala 2.10 und älter:
Und build.sbt:
Scala 2.11+ und neuer:
Und build.sbt:
quelle
Nachdem ich eine Weile slf4s und logula verwendet hatte, schrieb ich
loglady
ein einfaches Protokollierungsmerkmal, das slf4j umschließt.Es bietet eine API ähnlich der Python-Protokollierungsbibliothek, die die gängigen Fälle (einfache Zeichenfolge, einfache Formatierung) trivial macht und das Formatieren von Boilerplates vermeidet.
http://github.com/dln/loglady/
quelle
Ich finde es sehr praktisch, eine Art Java-Logger zu verwenden, zum Beispiel sl4j, mit einem einfachen Scala-Wrapper, der mir eine solche Syntax bringt
Meiner Meinung nach eine sehr nützliche Mischung aus Java-bewährten Protokollierungs-Frameworks und Scalas ausgefallener Syntax.
quelle