Как получить конкретный запрос в журнале - PullRequest
0 голосов
/ 10 марта 2011

Ниже мой журнал.

2011-03-10 20:34:16,657  INFO [jdbc.sqlonly]
SELECT          COL1
    ,   COL2    -- some comments may be here
    ,   COL3
FROM        TABLE_A
WHERE       COL4 = 'some_text'
/* [related.classname] : some comments go here */
2011-03-10 20:34:16,658 DEBUG [another.class.name] blahblah
.
.
.
2011-03-10 20:34:16,843  INFO [jdbc.sqlonly]
SELECT         MAX(COL_A)
FROM        TABLE_B
WHERE       COL_T < CURRENT_TIMESTAMP
/* [other.classname] : some comments go here */
2011-03-10 20:34:16,844 DEBUG [other.class.name2] blahblah
.
.

Я хочу выполнить этот запрос с помощью команды tail -f и поймать ТОЛЬКО связанный. Поскольку каждый запрос включает символ перевода строки, не может быть полезно использовать команду grep. Как я могу это сделать? Я обеспокоен возможной командой, использующей sed, например:

tail -f some.log | sed -n '/jdbc\.sqlonly/,/2011-03-10 /p'

Может помочь найти только запрос, а не журнал отладки, но не перехватил связанное имя класса (related.classname). Пожалуйста, помогите мне. Ах, мой сервер AIX.

Ответы [ 3 ]

1 голос
/ 29 марта 2011

Awk хорошо подходит для этого типа задач. По сути, скрипт awk обрабатывает одну строку за раз, но позволяет вам изменять / читать глобальные переменные при обработке каждой строки. Чтобы применить awk к этой проблеме, вы можете создать мини-конечный автомат, который будет помнить при обработке строки «внутри» записи журнала и печатать любую информацию из «совпадающих» записей.

Вот пример программы на awk. Блок BEGIN выполняется один раз перед обработкой любого ввода, в то время как основной блок выполняется один раз в строке - $0 содержит все содержимое строки.

BEGIN{
    inmatch=0
    last=""
}
{
    if(match($0,"INFO|DEBUG")){
        if(inmatch){
            print last
        }
        inmatch=0
    }
    if(match($0,"jdbc\.sqlonly")){
        inmatch=1
    }
    last=$0
}

Этот скрипт печатает последнюю строку каждой записи журнала, которая начиналась со строки, содержащей jdbc.sqlonly. Начало новой записи журнала определяется как любая строка, содержащая INFO или DEBUG. Параметр регулярного выражения для функции match () можно легко настроить. Чтобы запустить скрипт, сохраните его в файле и вызовите следующим образом:

$ cat log.file | awk -f script.awk
/* [related.classname] : some comments go here */
/* [other.classname] : some comments go here */

«Комбинированные» или однострочные сценарии awk также можно создавать в командной строке, что удобно для временных решений, которые не оправдывают использование полнофункционального языка сценариев.

$ cat test.file | awk 'BEGIN{inmatch=0;last=""}{if(match($0,"INFO|DEBUG")){if(inmatch){print last}inmatch=0} if(match($0,"jdbc\.sqlonly")){inmatch=1}last=$0}'
/* [related.classname] : some comments go here */
/* [other.classname] : some comments go here */
0 голосов
/ 26 мая 2016

Вот тот, который я использую ...

tail -F yourLog.log | sed -nr ':main; /^2011.*sql/ { :loop; p; n; /^2011/ b main; b loop} '

Здесь 2011 - шаблон каждой строки журнала, с которой начинается.sql - это слово, которое я ищу.

0 голосов
/ 10 марта 2011

Для sed, который я использую, команда диапазона выглядит жадной и соответствует последней дате.

Вы можете egrep для «INFO | DEBUG» и манипулировать этим при необходимости.

Я надеюсь, что это поможет.

PS, поскольку вы, кажется, являетесь новым пользователем, если вы получаете ответ, который помогает вам, пожалуйста, помните, чтобы пометить его как принятый, или дать ему + (или -) в качестве полезногоответ

...