Разборные строки журнала в используемые детали
-
10-12-2019 - |
Вопрос
Я пишу приложение, которое будет подано непрерывное поток строк / данных. Данные являются журнальными сообщениями, а из разных машин и различных приложений. Таким образом, их формат может быть немного другим.
Моя цель - получить отдельных компонентов из каждого сообщения, и независимо от источника, попробуйте в некотором роде, чтобы таким образом нормализовать данные, так что общие детали, такие как хост, нить, время, сообщение и уровень.
<Сильные> вопросы
- У log4j есть поддержка для чего-то вроде? I.e. Принимая строку, возвращающую цель своего рода, которое можно использовать, чтобы получить деталь, упомянутую ранее?
- Если нет, есть ли какие-то библиотеки для этого или что-то подобное?
- В идеале я бы хотел, если бы я мог предоставить несколько шаблонов для его совпадения, а падение, которая используется по умолчанию, если ни одна из других шаблонов совпадает. Что-нибудь подобное?
Я понимаю, что такие вещи, как AWSTATS, разбираются в журнал, а что нет, но в этом случае мои единственные два варианта - использовать библиотеку, которая делает это или писать что-то, и я бы предпочел не изобретать колесо.
Решение
You could use parser combinators for that. E.g. this parses a tuple of integers:
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)
Here is a good starting point: http://www.codecommit.com/blog/scala/the-magic-behind-parser-combinators