Перечислитель playframework катящийся контент файла, поскольку строка получила странные символы

def buildLog(appName: String) = {
  val file = s"${sys.env("HOME")}/builds/logs/${appName}.log"
  val f = new File(file)
  Enumerator.fromFile(f).map(new String(_))
}

Я хочу отобразить файл журнала на веб-странице, я использую Enumerator.fromFile() метод и сопоставить массив байтов с String, но я получаю некоторые странные символы, такие как

From xxx:yyy/zzz
 * branch            master     -> FETCH_HEAD
Already up-to-date.
[0m[[0minfo[0m] [0mLoading project definition from /home/zzz/builds/sources/ops-ui/project[0m
[0m[[0minfo[0m] [0mSet current project to zzz (in build file:/home/zzz/builds/sources/ops-ui/)[0m
[0m[[32msuccess[0m] [0mTotal time: 0 s, completed 2013-12-30 17:38:53[0m

Как правильно отображать контент?

2 ответа

Решение

Эти символы определяют цвета, которые консоль должна использовать для отображения текста (например, информация в голубом и ошибки в красном).

Чтобы удалить символы из вашего файла, вы можете изменить конфигурацию регистрации, например заменить %coloredLevel с %level в conf / logger.xml.

В качестве альтернативы, вы можете реализовать LogManager переписывать логи по мере необходимости. Это вдохновлено подобными emojiLogs, но я не проверял это:

logManager ~= { lm =>
  new LogManager {
    def apply(
        data: sbt.Settings[Scope],
        state: State,
        task: Def.ScopedKey[_],
        writer: java.io.PrintWriter
    ) = {
      val l = lm.apply(data, state, task, writer)
      new Logger {
        val Escapes = Set("M\\\\[2K", "\\[0m", "\\[32m")
        def ommitColorChars(str: String) = Escapes.fold(str)(_.replaceAll(_))
        def log(level: Level.Value, message: => String) =
          l.log(level, ommitColorChars(message))
        def success(message: => String) = l.success(message)
        def trace(t: => Throwable) = l.trace(t)
        override def ansiCodesSupported = l.ansiCodesSupported
      }
    }
  }
}

Просто, чтобы завершить ответ, я нашел более общий способ удаления цветных бревен. Цветные символы можно удалить как (при условии, что у вас есть строка с цветными бревнами):

string.replaceAll("""\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]""", "")

Вдохновлен эквивалентом "sed" в команде Linux ( 1):

sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
Другие вопросы по тегам