У меня есть файл журнала, который приходит из весеннего файла журнала.Файл журнала имеет три формата.Каждый из первых двух форматов представляет собой одну строку, между ними, если есть ключевое слово app-info, это сообщение, напечатанное собственным разработчиком.Если нет, это напечатано рамкой весны.Мы можем относиться к сообщениям разработчиков иначе, чем к сообщениям Spring Framework.Третий формат - трассировка многострочного стека.
У нас есть пример для нашего собственного формата, например
2018-04-27 10:42:49 [http-nio-8088-exec-1] - INFO - app-info - injectip ip 192.168.16.89
В приведенной выше строке работает ключ app-info
, так что это наши собственные разработчики.
2018-04-27 10:42:23 [RMI TCP Connection(10)-127.0.0.1] - INFO - org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring FrameworkServlet 'dispatcherServlet'
В приведенной выше строке нет ключевого слова app-info
, поэтому оно печатается в рамках Spring.
В моем фильтре Grok первый шаблон предназначен для сообщений, напечатанных из Spring Framework, второй - для сообщений разработчиков, третий - для многострочной трассировки стека.Прежде всего, я хочу четко упомянуть, что шаблон Spring Spring не имеет ключевого слова app-info, чтобы он мог получить исключение paserexception и следовать второму шаблону, который является собственным форматом разработчиков.Итак, у меня есть следующие форматы в regex tool , но я получил ошибку компиляции.Мое регулярное выражение выглядит следующим образом:
(?<timestamp>[\d\-\s\:]+)\s\[(?<threadname>[\d\.\w\s\(\)\-]+)\]\s-\s(?<loglevel>[\w]+)\s+-\s+(?<systemmsg>[^((?app-info).)*\s\.\w\-\'\:\d\[\]\/]+)
, поскольку в фильтре Grok я использую инструкцию по этой ссылке
filter {
grok {
match => [ "message", "PATTERN1", "PATTERN2" , "PATTERN3" ]
}
}
Моя текущая конфигурация в logstash выглядит следующим образом:четко не упоминает app-info в шаблоне:
filter {
grok {
match => [
"message",
'(?<timestamp>[\d\-\s\:]+)\s\[(?<threadname>[\d\.\w\s\(\)\-]+)\]\s-\s(?<loglevel>[\w]+)\s+-\s+(?<systemmsg>[\s\.\w\-\'\:\d\[\]\/^[app-info]]+)',
'(?<timestamp>[\d\-\s\:]+)\s\[(?<threadname>[\d\.\w\s\(\)\-]+)\]\s-\s(?<loglevel>[\w]+)\s+-\s(?<appinfo>app-info)\s-\s(?<systemmsg>[\w\d\:\{\}\,\-\(\)\s\"]+)',
'(?<timestamp>[\d\-\s\:]+)\s\[(?<threadname>[\w\-\d]+)\]\s-\s(?<loglevel>[\w]+)\s\-\s(?<appinfo>app-info)\s-\s(?<params>params):(?<jsonstr>[\"\w\d\,\:\.\{\}]+)\s(?<exceptionname>[\w\d\.]+Exception):\s(?<exceptiondetail>[\w\d\.]+)\n\t(?<extralines>at[\s\w\.\d\~\?\n\t\(\)\_\[\]\/\:\-]+)\n\d'
]
}
}
С форматом, указанным выше в конфигурации logstash, при работе с
2018-04-27 10:42:49 [http-nio-8088-exec-1] - INFO - app-info - injectip ip 192.168.16.89
Первый шаблон (шаблон рамки весны) уже работаеттак что это не относится ко второму шаблону, который является форматом наших собственных разработчиков.Синтаксический анализатор успешно проанализирован следующим образом:
{
"timestamp": [
[
"2018-04-27 10:42:49"
]
],
"threadname": [
[
"http-nio-8088-exec-1"
]
],
"loglevel": [
[
"INFO"
]
],
"systemmsg": [
[
"app-info - injectip ip 192.168.16.89\n\n"
]
]
}
Любые подсказки, которые я мог бы позволить первому шаблону четко указать, что systemmsg не должен содержать ключевое слово "app-info"?
EDIT:
Моя цель состоит в том, чтобы, если нет ключевого слова app-info, я позволил шаблону 1 обрабатывать журнал.Если есть ключевое слово app-info, я разрешу шаблону 2 обрабатывать журнал.
Со следующим журналом, который не содержит ключевого слова app-info (должен работать шаблон 1),
2018-04-27 10:42:23 [RMI TCP Connection(10)-127.0.0.1] - INFO - org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring FrameworkServlet 'dispatcherServlet'
Я получил следующий результат, не совпадающий с первым измененным шаблоном по вашему предложению, которыйне моя цель.
(?<timestamp>[\d\-\s\:]+)\s\[(?<threadname>[\d\.\w\s\(\)\-]+)\]\s-\s(?<loglevel>[\w]+)\s+-\s+(?<systemmsg>[^(?:(?!app\-info).)*\s\.\w\-\'\:\d\[\]\/]+)
см. демо .Моя цель - извлечь временную метку, имя потока, уровень журнала и системные сообщения.Но первая модель не дает ожидаемого результата.Инструмент говорит, что нет совпадения.
если я удаляю ^ (? :( ?! app-info).) *, То выше парсер журнала (без ключевого слова app-info) работает.См. demo Но теперь, это также работает для журнала, который содержит ключевое слово app-info, которое не ожидается, так как теперь я хочу извлечь метку времени, имя потока, уровень журнала, app-info (существует или нет) (поле должно быть извлечено или сгруппировано), затем systemmsg.Ожидается, что первый синтаксический анализатор возвратит ошибку, пусть второй анализатор обработает журнал. demo мог видеть, что парсер также работает для журнала с ключевым словом app-info.Systemmsg поместил поле app-info в его значение, которое не ожидается.
Итак, я хочу шаблон 1, обрабатывает журнал без ключевой информации app, шаблон 2 обрабатывает журнал с ключевой информацией app.Таким образом, я ясно позволяю шаблону 1 генерировать ошибку или исключение синтаксического анализа, когда он содержит ключевое слово app-info.