Scala: средство ведения журнала отладки и настройка уровня ведения журнала в коде

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

Основными ингредиентами являются Скала-каротаж библиотека, которая оборачивается SLF4J , Simple Logging Facade для Java и совместимый бэкэнд, я использую Logback , наследник Log4j.

В настоящий момент добавление следующих строк в ваш build.sbt будет включать в себя необходимые библиотеки:

libraryDependencies + = "com.typesafe.scala-logging" %% "scala-logging"% "3.7.2" libraryDependencies + = "ch.qos.logback"% "logback-classic"% "1.2.3"

Далее необходимо настроить ведение журнала по умолчанию, добавив файл src / main / resources / logback.xml, содержащий как минимум следующую запись для входа в stdout:

<конфигурация> <appender name = "STDOUT" class = "ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>% d {ЧЧ: мм: сс} [% thread]% -5level% logger {36 } -% msg% n </ pattern> </ encoder> </ appender> <root level = "info"> <appender-ref ref = "STDOUT" /> </ root> </ configuration>

Обратите внимание, что уровень по умолчанию здесь установлен на info. Более подробную информацию о формате logback.xml можно найти Вот ,

В коде scala достаточно простого добавления черты LazyLogging для начала:

импорт ком. typesafe .scalalogging .LazyLogging объект ApplicationMain расширяет приложение с помощью LazyLogging {... logger .trace (...) logger. отладчик (...) логгер. регистратор информации (...). предупредить (...) регистратор. ошибка ( ... )

(вышеприведенные команды становятся все более серьезными) Сообщения будут отображаться только в том случае, если вызов регистратора имеет более серьезную серьезность, чем настроено в logback.xml (или INFO по умолчанию). Это означает, что ничего из уровня трассировки и отладки не будет показано.

Но мы не хотим всегда поставлять новую программу с другим logback.xml, поэтому программное изменение уровня журнала по умолчанию является каким-то строгим требованием. К счастью, храбрая душа опубликовал решение на стеке, а именно

импорт ч. qos .logback .classic. {Level, Logger} import org. slf4j .LoggerFactory LoggerFactory. getLogger (org. slf4j .Logger .ROOT_LOGGER_NAME). asInstanceOf [Logger]. setLevel (Level. DEBUG)

Это можно использовать для оценки параметров командной строки и активации отладки на лету. Я часто делаю это, чтобы разрешить флаги -q, -qq, -d и -dd для бесшумной , сверхтихой , отладки , дополнительной отладки , которые будут переведены в предупреждение уровней ошибок, ошибок, отладки и трассировки, соответственно. Несколько вызовов выбирают максимальный уровень отладки (поэтому -q -d включает отладку).

Это можно активировать с помощью следующего простого кода:

val cmdlnlog: Int = args. map ({case "-d" => Уровень. DEBUG_INT case "-dd" => Уровень. TRACE_INT case "-q" => Уровень. WARN_INT case "-qq" => Уровень. ERROR_INT case _ => - 1} ) .foldLeft (Level. OFF_INT) (scala. math .min (_, _)) if (cmdlnlog == - 1) {// Передан неизвестный уровень журнала, ошибка из консоли. err .println ("Неподдерживаемый аргумент командной строки передан, завершается.") sys. exit (0)} // если ничего не было передано в командной строке, используйте INFO val newloglevel = if (cmdlnlog == Level. OFF_INT) Level. INFO_INT else cmdlnlog LoggerFactory. getLogger (org. slf4j .Logger .ROOT_LOGGER_NAME). asInstanceOf [Logger]. setLevel (Level. toLevel (newloglevel))

где args - параметры командной строки (в случае ScalaFX это были бы параметры .unname, в случае обычного приложения Scala - аргумент основной функции входа). Конечно, более сложные аргументы командной строки требуют более сложного подхода.

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