разобрать строки журнала в пригодные для использования части - PullRequest
0 голосов
/ 09 марта 2012

Некоторый контекст

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

Моя цель - получить отдельные компоненты из каждого сообщения, и независимо от источника, попытаться каким-либо образом нормализовать данные, чтобы общие части, такие как хост, поток, время, сообщение и уровень.

Вопросы

  1. Есть ли в log4j какая-либо поддержка для чего-то подобного? т.е. взять строку, возвращающую какой-либо объект, который можно использовать для получения части, упомянутой ранее?
  2. Если нет, есть ли библиотеки для этого или что-то подобное?
  3. В идеале мне бы хотелось, чтобы я мог предоставить несколько шаблонов для сопоставления, и использовать запасной вариант, который используется по умолчанию, если ни один из других шаблонов не совпадает. Что-нибудь подобное?

Я понимаю, что такие вещи, как Awstats, выполняют синтаксический анализ логов, а что нет, но в этом случае у меня есть только два варианта - использовать библиотеку, которая делает это, или что-то написать, и я бы не стал изобретать велосипед.

1 Ответ

3 голосов
/ 09 марта 2012

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

import scala.util.parsing.combinator.RegexParsers

object Parser extends RegexParsers {
  def intPair = INT ~ "," ~ INT ^^ { x => (x._1._1.toInt,x._2.toInt) }
  val INT = "[0-9]+".r
}


Parser.parseAll(Parser.intPair, "10,22") // => (10,22)

Вот хорошая отправная точка: http://www.codecommit.com/blog/scala/the-magic-behind-parser-combinators

...