Wie zu unterdrücken Spark Anmeldung im unit-tests?
So, Dank leicht googleable blogs, die ich ausprobiert:
import org.specs2.mutable.Specification
class SparkEngineSpecs extends Specification {
sequential
def setLogLevels(level: Level, loggers: Seq[String]): Map[String, Level] = loggers.map(loggerName => {
val logger = Logger.getLogger(loggerName)
val prevLevel = logger.getLevel
logger.setLevel(level)
loggerName -> prevLevel
}).toMap
setLogLevels(Level.WARN, Seq("spark", "org.eclipse.jetty", "akka"))
val sc = new SparkContext(new SparkConf().setMaster("local").setAppName("Test Spark Engine"))
//... my unit tests
Aber leider klappt es nicht, ich bekomme immer noch eine Menge von spark output, z.B.:
14/12/02 12:01:56 INFO MemoryStore: Block broadcast_4 of size 4184 dropped from memory (free 583461216)
14/12/02 12:01:56 INFO ContextCleaner: Cleaned broadcast 4
14/12/02 12:01:56 INFO ContextCleaner: Cleaned shuffle 4
14/12/02 12:01:56 INFO ShuffleBlockManager: Deleted all files for shuffle 4
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fügen Sie den folgenden code in die
log4j.properties
Datei imsrc/test/resources
dir, erstellen Sie die Datei/dir-falls nicht vorhandenWenn ich meine unit-tests (ich bin mit JUnit und Maven), ich erhalten nur WARNEN-level-Protokolle, in anderen Worten nicht mehr überladen mit INFO-level-Protokolle (obwohl Sie nützlich sein kann, manchmal für debugging).
Ich hoffe, das hilft.
In meinem Fall eine meiner eigenen Bibliotheken gebracht logback-classic in den mix. Dies materialisiert in eine Warnung zu Beginn:
Ich dies Problem gelöst, indem Sie ohne es aus der Abhängigkeit:
Nun ich könnte hinzufügen, ein
log4j.properties
Datei intest/resources
die jetzt benutzt wird, von Spark.Nach einiger Zeit des Kampfes mit Funken-log-Ausgabe als gut, fand ich einen blog-post mit einer Lösung, die ich besonders mochte.
Wenn Sie slf4j, kann man einfach den Austausch der zugrunde liegenden Protokoll-Implementierung. Eine gute canidate für die test-Umfang ist slf4j-nop, die Beine nimmt, die log-Ausgabe und stellt es dahin, wo die Sonne nie scheint.
Bei der Verwendung von Maven können Sie fügen Sie den folgenden an die Spitze der Liste Abhängigkeiten:
Beachten Sie, dass es wichtig sein könnte, haben es am Anfang der Liste Abhängigkeiten, um sicherzustellen, dass die angegebenen Implementierungen verwendet werden, anstatt mit denen, die kommen könnte mit anderen Paketen (und die, die Sie betrachten können, um auszuschließen, um Ihre class-path, der sauber und vermeiden Sie unerwartete Konflikte).
Ein wenig spät zur party, aber ich fand das in der spark-Beispiel-code :
Fand ich auch, dass Sie mit Ihrem code, wenn Sie anrufen setLogLevels wie unten ausgeschnitten eine Menge von out-put für mich.
Können Sie in einer eigenen Logback config für tests. Je nach Umgebung ist es möglich, dass Sie brauchen nur zu erstellen
conf/logback-test.xml
etwas versteckt, dass die Protokolle. Ich denke, das sollte tun:Als ich verstehen es, diese erfasst alle Protokolle (Ebene
debug
und höher) und weist keinen logger zu Ihnen, so werden Sie verworfen. Eine bessere option ist die Konfiguration eines file-logger für Sie, so können Sie immer noch Zugriff auf die Protokolle, wenn Sie möchten.Sehen http://logback.qos.ch/manual/configuration.html für die ausführliche Dokumentation.
logback-test.xml
ist in<project root>/conf
hier. Die Datei ist nicht irgendwo erwähnt unsere Quelle, so dass es möglicherweise ein Magischer Standard-Speicherort. Ich sehe nichts anderes... Wenn ich die Datei löschen, fange ich an log-Ausgabe (vonwarn
up) während des tests. Wir verwenden Scalatest.proj-root/conf/
kein Glück. Ich bin ein wenig verwirrt, wie Sie es je bekommen würde, hob legen, da das mit dem Namen noch Inhalt Referenz Funken. In der Zwischenzeit bin ich über ein wirklich hacky-Skript, das einegrep -v
mit regex irgendwie löscht den spark-Protokolle.test/resources/logback.xml
.Die einfachste Lösung für mich ist: