Jaki jest dobry sposób logowania się w aplikacji Scala? Coś, co jest zgodne z filozofią języka, nie zaśmieca kodu, jest łatwe w utrzymaniu i dyskretne. Oto lista podstawowych wymagań:
- prosty
- nie zaśmieca kodu. Scala jest świetna ze względu na swoją zwięzłość. Nie chcę, aby połowa mojego kodu zawierała instrukcje logowania
- format dziennika można zmienić, aby pasował do reszty dzienników przedsiębiorstwa i oprogramowania do monitorowania
- obsługuje poziomy logowania (tj. debugowanie, śledzenie, błąd)
- może logować się na dysk, a także w innych miejscach docelowych (np. gniazdo, konsola itp.)
- minimalna konfiguracja, jeśli istnieje
- działa w kontenerach (np. serwer WWW)
- (opcjonalnie, ale miło mieć) pojawia się albo jako część języka, albo jako artefakt mavena, więc nie muszę hakować moich kompilacji, aby go używać
Wiem, że mogę korzystać z istniejących rozwiązań do logowania w Javie, ale zawodzą one co najmniej w dwóch z powyższych, a mianowicie w bałaganie i konfiguracji.
Dziękuję za twoje odpowiedzi.
W przypadku wersji 2.10+ Scala rozważ ScalaLogging firmy Typesafe. Używa makr, aby zapewnić bardzo czysty interfejs API
https://github.com/typesafehub/scala-logging
Cytując z ich wiki:
Po zastosowaniu makra kod zostanie przekształcony w wyżej opisany idiom.
Ponadto ScalaLogging oferuje cechę,
Logging
która w wygodny sposób zapewniaLogger
instancję zainicjowaną nazwą klasy zmieszaną z:źródło
class MyClass with Logging
."com.typesafe" %% "scalalogging-slf4j" % "1.1.0"
.Używanie slf4j i wrappera jest fajne, ale użycie jego wbudowanej interpolacji nie działa, gdy masz więcej niż dwie wartości do interpolacji, ponieważ wtedy musisz utworzyć tablicę wartości do interpolacji.
Rozwiązaniem bardziej podobnym do Scali jest użycie thunk lub klastra do opóźnienia konkatenacji komunikatu o błędzie. Dobrym tego przykładem jest rejestrator Lift
Log.scala Slf4jLog.scala
Co wygląda tak:
Zauważ, że msg to wywołanie według nazwy i nie będzie oceniane, chyba że isTraceEnabled ma wartość true, więc generowanie ładnego ciągu wiadomości nie wiąże się z żadnymi kosztami. Działa to wokół mechanizmu interpolacji slf4j, który wymaga przeanalizowania komunikatu o błędzie. W tym modelu można interpolować dowolną liczbę wartości do komunikatu o błędzie.
Jeśli masz osobną cechę, która łączy ten Log4JLogger z Twoją klasą, możesz to zrobić
zamiast
źródło
Nie używaj Logula
Właściwie zastosowałem się do zalecenia Eugene'a i wypróbowałem go i odkryłem, że ma niezdarną konfigurację i jest narażony na błędy, które nie są naprawiane (takie jak ten ). Nie wygląda na dobrze utrzymaną i nie obsługuje Scali 2.10 .
Użyj slf4s + slf4j-simple
Kluczowe korzyści:
-Dorg.slf4j.simplelogger.defaultlog=trace
polecenie wykonania lub twardy kod w swoim skrypcie:System.setProperty("org.slf4j.simplelogger.defaultlog", "trace")
. Nie ma potrzeby zarządzania tandetnymi plikami konfiguracyjnymi!Run/Debug Configurations
i dodaj-Dorg.slf4j.simplelogger.defaultlog=trace
doVM options
.Oto, czego potrzebujesz, aby uruchomić go z Maven:
źródło
Oto jak sprawiłem, że Scala Logging działa dla mnie:
Umieść to w swoim
build.sbt
:Następnie, po wykonaniu
sbt update
, wypisuje przyjazny komunikat dziennika:Jeśli korzystasz z gry, można oczywiście po prostu
import play.api.Logger
do pisania wiadomości dziennika:Logger.debug("Hi")
.Zobacz dokumentację, aby uzyskać więcej informacji.
źródło
log4j.properties
wewnątrz folderu zasobów projektu.Wyciągnąłem trochę pracy z
Logging
cechyscalax
i stworzyłem cechę, która również integrujeMessageFormat-based
bibliotekę.Wtedy rzeczy wyglądają tak:
Jak dotąd podoba nam się to podejście.
Realizacja:
źródło
Używam SLF4J + Logback classic i stosuję to w następujący sposób:
Następnie możesz go użyć w zależności od tego, który lepiej pasuje do Twojego stylu:
ale to podejście oczywiście wykorzystuje instancję rejestrującą na instancję klasy.
źródło
Powinieneś rzucić okiem na bibliotekę scalax: http://scalax.scalaforge.org/ W tej bibliotece jest cecha Logging, wykorzystująca sl4j jako backend. Używając tej cechy, możesz się całkiem łatwo zalogować (po prostu użyj pola loggera w klasie dziedziczącej cechę).
źródło
Writer
,Monoid
AMonad
realizacja.źródło
Jeszcze tego nie próbowałem, ale Configgy wygląda obiecująco zarówno pod względem konfiguracji, jak i logowania:
http://github.com/robey/configgy/tree/master
źródło
Szybkie i łatwe formularze.
Scala 2.10 i starsze:
I build.sbt:
Scala 2.11+ i nowsze:
I build.sbt:
źródło
Po pewnym czasie używania slf4s i logula napisałem
loglady
prosty opis funkcji logowania slf4j.Oferuje API podobne do biblioteki logującej Pythona, co sprawia, że typowe przypadki (podstawowy ciąg, proste formatowanie) są trywialne i unika formatowania standardowego.
http://github.com/dln/loglady/
źródło
Uważam za bardzo wygodne używanie jakiegoś loggera java, na przykład sl4j, z prostym opakowaniem scala, który daje mi taką składnię
Moim zdaniem bardzo przydatne połączenie sprawdzonych w Javie frameworków logowania i fantazyjnej składni scali.
źródło