Как я могу использовать команду grep для захвата идентификатора корреляции вместе с трассировкой стека Java и многострочным сообщением из файла журнала - PullRequest
2 голосов
/ 27 июня 2019

В файле журнала каждому отправленному запросу автоматически присваивается один уникальный идентификатор корреляции, например X-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa и X-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb, как в примере журнала ниже, который был создан log4j.

2019-06-03 11:27:22,697|X-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|INFO |com.example.ExampleService|Start execute
2019-06-03 11:27:22,697|X-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|INFO |com.example.ExampleService|ENTRY| performIntegration()
2019-06-03 11:27:20,759|X-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|INFO |com.example.ExampleService|EXIT| executeService()
2019-06-03 11:27:20,759|X-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|INFO |com.example.ExampleService|EXIT| MyObject = This,
is
a
multiline log
message
2019-06-03 11:27:20,759|X-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|ERROR|com.example.ExampleAdapter|error
com.example.ABCRuntimeException: Network error
    at ...
    at ...
Caused by: ...
    at ...
    at ...
2019-06-03 11:27:22,698|X-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|INFO |com.example.ExampleService|EXIT| performIntegration()
2019-06-03 11:27:22,699|X-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|INFO |com.example.ExampleService|EXIT| executeService()
2019-06-03 11:27:22,699|X-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|ERROR|com.example.ExampleAdapter| another error
com.example.ABCRuntimeException: Network error
    at ...
    at ...
Caused by: ...
    at ...
    at ...

Как можно сопоставить идентификатор корреляции с многострочным сообщением и трассировкой стека Java вместе?Например, я хочу grep X-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb, тогда ожидаемый результат должен быть таким, как указано ниже

2019-06-03 11:27:20,759|X-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|INFO |com.example.ExampleService|EXIT| executeService()
2019-06-03 11:27:20,759|X-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|INFO |com.example.ExampleService|EXIT| MyObject = This,
is
a
multiline log
message
2019-06-03 11:27:20,759|X-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|ERROR|com.example.ExampleAdapter|error
com.example.ABCRuntimeException: Network error
    at ...
    at ...
Caused by: ...
    at ...
    at ...

Может ли команда linux grep добиться этого?Или есть другие рекомендуемые инструменты?Однако я не могу устанавливать новый пакет на производственных серверах.Операционная система Red Hat 7.

1 Ответ

1 голос
/ 27 июня 2019

Попробуйте:

$ awk -F\| -v id='X-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' '/^[0-9]{4}-[0-9]{2}-[0-9]{2} /{f=0} $2==id{f=1} f' file
2019-06-03 11:27:20,759|X-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|INFO |com.example.ExampleService|EXIT| executeService()
2019-06-03 11:27:20,759|X-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|INFO |com.example.ExampleService|EXIT| MyObject = This,
is
a
multiline log
message
2019-06-03 11:27:20,759|X-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|ERROR|com.example.ExampleAdapter|error
com.example.ABCRuntimeException: Network error
    at ...
    at ...
Caused by: ...
    at ...
    at ...

Как это работает

  • -F\|

    Используйте | в качестве разделителя полей.

  • -v id='X-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'

    Создайте переменную awk с именем id и присвойте ей интересующий идентификатор.

  • /^[0-9]{4}-[0-9]{2}-[0-9]{2} /{f=0}

    Если текущая строка начинается с даты, установите для переменной f значение false (ноль).

  • $2==id{f=1}

    Если второе поле соответствует желаемому идентификатору, установите для переменной f значение true (один).

  • f

    Если f истинно, выведите строку.

...