Разобрать строки журнала в пригодные для использования части
Некоторый контекст
Я пишу приложение, которое будет получать непрерывный поток строк / данных. Данные представляют собой сообщения журнала, но с разных компьютеров и из разных приложений. Так что их формат может немного отличаться.
Моя цель - получить отдельные компоненты из каждого сообщения и, независимо от источника, попытаться каким-либо образом нормализовать данные таким образом, чтобы общие части, такие как хост, поток, время, сообщение и уровень.
Вопросы
- Есть ли у log4j какая-нибудь поддержка для чего-то подобного? т.е. взять строку, возвращающую объект какого-либо вида, который может быть использован для получения части, упомянутой ранее?
- Если нет, есть ли библиотеки для этого или что-то подобное?
- В идеале мне бы хотелось, чтобы я мог предоставить несколько шаблонов для сопоставления, и использовать запасной вариант, который используется по умолчанию, если ни один из других шаблонов не совпадает. Что-нибудь подобное?
Я понимаю, что такие вещи, как Awstats, выполняют синтаксический анализ логов, а что нет, но в этом случае у меня есть только два варианта - использовать библиотеку, которая это делает, или что-то написать, и я бы не стал изобретать велосипед.
1 ответ
Вы можете использовать парсер комбинаторы для этого. Например, это анализирует кортеж целых чисел:
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