Подтвердить что ты не робот

Как подавить регистрацию искр в модульных тестах?

Итак, благодаря легкодоступным блогам, которые я пробовал:

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

Но, к сожалению, это не работает, я все еще получаю много искрового выхода, например:

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
4b9b3361

Ответ 1

Добавьте следующий код в файл log4j.properties внутри директории src/test/resources, создайте файл /dir, если он не существует

# Change this to set Spark log level
log4j.logger.org.apache.spark=WARN

# Silence akka remoting
log4j.logger.Remoting=WARN

# Ignore messages below warning level from Jetty, because it a bit verbose
log4j.logger.org.eclipse.jetty=WARN

Когда я запускаю модульные тесты (я использую JUnit и Maven), я получаю только журналы WARN level, другими словами, больше не загромождает журналы уровня INFO (хотя они иногда могут быть полезны для отладки).

Надеюсь, это поможет.

Ответ 2

В моем случае одна из моих собственных библиотек привнесла в композицию logback-classic. Это произошло в начале предупреждения:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/alex/.ivy2/cache/ch.qos.logback/logback-classic/jars/logback-classic-1.1.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/alex/.ivy2/cache/org.slf4j/slf4j-log4j12/jars/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]

Я решил это, исключив его из зависимости:

"com.mystuff" % "mylib" % "1.0.0" exclude("ch.qos.logback", "logback-classic")

Теперь я мог добавить файл log4j.properties в test/resources, который теперь используется Spark.

Ответ 3

После некоторого времени борьбы с выходом журнала Spark, я нашел сообщение в блоге с решением, которое мне особенно понравилось.

Если вы используете slf4j, можно просто обменивать базовую реализацию протокола. Хорошим Canidate для области тестирования является slf4j-nop, который с готовностью принимает выход журнала и помещает его туда, где солнце никогда не светит.

При использовании Maven вы можете добавить следующее в список своих зависимостей:

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.12</version>
  <scope>provided</scope>
</dependency>

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-nop</artifactId>
  <version>1.7.12</version>
  <scope>test</scope>
</dependency>

Обратите внимание, что может быть важно иметь его в начале списка зависимостей, чтобы убедиться, что данные реализации используются вместо тех, которые могут поставляться с другими пакетами (и которые вы можете считать исключенными, чтобы class path tidy и избежать непредвиденных конфликтов).

Ответ 4

Немного поздно для вечеринки, но я нашел это в искровом примере кода:

def setStreamingLogLevels() {
    val log4jInitialized = Logger.getRootLogger.getAllAppenders.hasMoreElements
    if (!log4jInitialized) {
        // We first log something to initialize Spark default logging, then we override the
        // logging level.
        logInfo("Setting log level to [WARN] for streaming example." +
        " To override add a custom log4j.properties to the classpath.")
        Logger.getRootLogger.setLevel(Level.WARN)
    }
}

Я также обнаружил, что с вашим кодом, если вы вызываете setLogLevels, как показано ниже, вырезаете много из меня.

setLogLevels(Level.WARN, Seq("spark", "org", "akka"))

Ответ 5

Вы можете использовать отдельную конфигурацию журнала для тестов. В зависимости от вашей среды возможно, что вам просто нужно создать conf/logback-test.xml с чем-то, что скрывает журналы. Я думаю, что это должно сделать это:

<configuration>
  <root level="debug">
  </root>
</configuration>

Как я понимаю, это фиксирует все журналы (уровень debug и выше) и не назначает им регистратор, поэтому они отбрасываются. Лучшим вариантом является настройка для них файлового регистратора, поэтому вы можете получить доступ к журналам, если хотите.

Для подробной документации см. http://logback.qos.ch/manual/configuration.html.

Ответ 6

Самое простое решение, работающее для меня:

cp $SPARK_HOME/conf/log4j.properties.template $YOUR_PROJECT/src/test/resources/log4j.properties
sed -i -e 's/log4j.rootCategory=INFO/log4j.rootCategory=WARN/g' $YOUR_PROJECT/src/test/resources/log4j.properties