LINUX.ORG.RU
ФорумAdmin

Вывод логов уровня INFO за определенный период времени.

 


1

2

Здравствуйте! Подскажите, пожалуйста, следующее. Есть файл с логами. Необходимо вывести все логи уровня INFO в период с 2012-12-13T10:00:00 до 2012-12-13T11:00:00. Никак не могу составить правильно команду. Вот что у меня получается grep '2012-12-13T10:*'|'INFO' log.txt. Как правильно сделать, чтобы выводились логи именно за период времени? Возможно нужно использовать не только grep/ Профан в линуксе, пытаюсь разбираться.



Последнее исправление: dszn (всего исправлений: 1)
Ответ на: комментарий от val-amart

[#|2012-12-13T08:02:01.864+0400|WARNING|sun-appserver2.1|com.sun.jbi.engine.bpel.core.bpel.trace.BPELTraceManager|_ThreadID=53;_ThreadName=sun-bpel-engine-thread-5;Process Instance Id=192.168.191.63:7e7e6603:13b925ed4df:-5b44;Service Assembly Name=InternetCRMCA;Activity Name=selectEmailOutbox;BPEL Process Name=processCrmEmailReply;_RequestID=ba208cff-ebda-4b93-9ba4-438abe279fc9;|Invoke::CRM_DB::End::SessionId=192.168.191.63:7e7e6603:13b925ed4df:-5b41|#]

[#|2012-12-13T08:02:01.864+0400|INFO|sun-appserver2.1|com.sun.jbi.engine.bpel.core.bpel.trace.BPELTraceManager|_ThreadID=53;_ThreadName=sun-bpel-engine-thread-5;Process Instance Id=192.168.191.63:7e7e6603:13b925ed4df:-5b44;Service Assembly Name=InternetCRMCA;Activity Name=EndProcess;BPEL Process Name=processCrmEmailReply;|Flow::MainFlow::End::SessionId=192.168.191.63:7e7e6603:13b925ed4df:-5b41|#]

dszn
() автор топика
Ответ на: комментарий от dszn

Perl FTW

perl -anl -F'\|' -MTime::Piece -e'BEGIN{ sub parse {Time::Piece::->strptime($_[0],"%Y-%m-%dT%H:%M:%S")}; $_=parse($_) for ($::start,$::end)}; my $date = parse ($F[1]=~\/(.*)\.\d+\+\d+/); print if $F[2] eq "INFO" and $date >= $::start and $date <= $::end' -s -- -start=2012-12-13T10:00:00 -end=2012-12-13T11:00:00

Вроде, проверил. Миллисекунды и часовой пояс игнорируются.

AITap ★★★★★
()
grep '2012-12-13T10:.*\|INFO'

P.S. Выше отписались 2 нтерпрaйзнутых, всегда использующих громоздкое общее решение, там где достаточно частного.

anonymous
()
Ответ на: комментарий от anonymous

Насколько я понимаю, вот эта команда grep '2012-12-13T10:.*\|INFO' правильная?

dszn
() автор топика
Ответ на: комментарий от anonymous
$ echo '2012-12-13T10:11|Anonymous такой onanimous|asdjklasasdwer|INFORMATIONkuku' | grep '2012-12-13T10:.*\|INFO'

2012-12-13T10:11|Anonymous такой onanimous|asdjklasasdwer|INFORMATIONkuku
sdio ★★★★★
()
DATEFROM='2012-12-13T10:00:00+04:00'
  DATETO='2012-12-13T11:00:00+04:00'

awk -F'|' -v f="$DATEFROM" -v t="$DATETO" \
  'BEGIN {  gsub("[-T:+]"," ",f);         \
            df=mktime(f);                 \
            gsub("[-T:+]"," ",t);         \
            dt=mktime(t);                 \
         }                                \
   { d=$2;                                \
     gsub("[-T:+]"," ",d);                \
     curdate=mktime(d);                   \
   }                                      \
   curdate >= df &&                       \
   curdate <= dt &&                       \
   $3 == "INFO"         {print $0}        \
'

Не проверял.

sdio ★★★★★
()
Последнее исправление: sdio (всего исправлений: 2)
Ответ на: комментарий от sdio

к сожалению, это не работает. mktime тихо игнорирует таймзону после микросекунд, так как не понимает микросекунд, в итоге сравнивает две даты в разных таймзонах. можно конечно просто убрать таймзону из спецификации to и from, но это ведь костыли.

я тоже начал с очень похожего скрипта на авке, но со временем проблемы с распарсиванием разных форматов даты меня заколебали вконец, и родился тот скрипт что я запостил. теперь просто адаптирую его каждый раз под конкретный случай. в него очень просто добавлять дополнительные фильтры, и он почти так же эффективен, как простой авк. надо бы запилить нормальный main туда, с интерфейсом командной строки и библиотекой фильтров, да залить куда-нибуть, проблема-то популярная.

val-amart ★★★★★
()
Ответ на: комментарий от val-amart

такие модульные универсальные скрипты никому кроме автора не нужны. в чужом дольше разбираться, а свой слабать 5 минут времени. миллисекунды не заметил, отрезать их в gsub недолго

sdio ★★★★★
()
DATE1=`date -d 2012-12-13T10:00:00.000+0400 +%s`
DATE2=`date -d 2012-12-13T11:00:00.000+0400 +%s`
while read LINE
do
    if [ -n "$LINE" ]
    then
        DATE3=$(date -d `echo $LINE | cut -d\| -f2` +%s)
        if [ $DATE3 -ge $DATE1 ] && [ $DATE3 -lt $DATE2 ] && [[ $LINE == *\|INFO\|* ]]
        then echo $LINE
        fi
    fi
done
gorky ★★
()
Ответ на: комментарий от gorky

лучше:

while read LINE; do
    if [ -n "$LINE" ]; then
тогда не будет этого:
then echo $LINE
можешь не прислушиваться, это больше вопрос собственного восприятия

anonymous
()
Ответ на: комментарий от anonymous

У меня так и написано

while read LINE
do
    if [ -n "$LINE" ]
    then
только вместо ";" используется перевод строки.

Не вижу, как твой вариант может привести к исключению

then echo $LINE
который относится к вложенному if.

gorky ★★
()
Ответ на: комментарий от gorky

это больше вопрос собственного восприятия

  • сокращает количество строк
  • дает возможность комментировать строку установкой в её начале символа #

привести к исключению

ни разу к этому не призывал

anonymous
()
Ответ на: комментарий от anonymous

Понятно. Я лучше воспринимаю код, когда структуры управления выделяются отступами.

gorky ★★
()
Ответ на: комментарий от gorky

Как сделать так, чтобы скрипт считывал строки из нужного файла?
Просто почему-то он не считывает строки из файла лога.

dszn
() автор топика
Ответ на: комментарий от dszn

оно читает данные из stdin, сделай:

$ cat source_file | ./script.sh

anonymous
()
Ответ на: комментарий от gorky

При запуске скрипта выходит такое сообщение: ./seek.sh: строка 13: 1355382000: Нет такого файла или каталога
Насколько я понимаю в файле лога нет даты 2012-12-13T11:00:00.000

dszn
() автор топика
Ответ на: комментарий от dszn

Исходя из содержания ошибки, 13 строчка скрипта пытается использовать значение переменной DATE3 как название файла или каталога. В моем скрипте нет строчки 13, а переменная DATE3 используется только в 8 строчке и в ней нет такой команды.

Возможно, текст скрипта скопирован неточно. Попробуйте заново скопировать текст скрипта в новый файл и, не внося никаких изменений в него, (в скрипте должно быть ровно 12 строчек) запустить его следующей командой:

cat log.txt | bash seek.sh

gorky ★★
()
Ответ на: комментарий от gorky

скопировал в новый файл, теперь вот такая ошибка:
poisk.sh: строка 8: [: -ge: ожидается использование унарного оператора date: лишний операнд «BPCOR-6174:»
По команде «date --help» можно получить дополнительную информацию.

dszn
() автор топика
Ответ на: комментарий от anonymous

Нашел причину ошибки. В файле с логами присутствуют блоки warning:
[#|2012-12-13T11:15:48.454+0400|WARNING|sun-appserver2.1|com.sun.jbi.engine.bpel.BPELSEHelper|_ThreadID=49;_ThreadName=sun-bpel-engine-thread-0;Process Instance
Если он встречается, то возникает ошибка. Как побороть не знаю.

dszn
() автор топика
Ответ на: комментарий от dszn

В седьмой строке скрипта аргумент date -d надо окружить двойными кавычками.

DATE3=$(date -d "`echo $LINE | cut -d\| -f2`" +%s)
Похоже, что в лог файле строка, содержащая подстроку «BPCOR-6174:» имеет другой формат.

gorky ★★
()
Ответ на: комментарий от dszn

Блок WARNING не должен мешать. Мешать могут строки, в которых дата имеет другой формат либо между первым и вторым знаком «|» строки находится не дата, а что-то другое.

gorky ★★
()
Ответ на: комментарий от gorky

Все-таки проблема в блоке warning. Вот такая ошибка:
date: неверная дата «Error properties\r» ./poisk.sh: строка 9: [: -ge: ожидается использование унарного оператора date: неверная дата «com.sun.jbi.crl.faultcode = Server\r» ./poisk.sh: строка 9: [: -ge: ожидается использование унарного оператора date: неверная дата «com.sun.jbi.crl.faultstring = BPCOR-6135
Вот сам блок:
[#|2012-12-13T11:15:48.454+0400|WARNING|sun-appserver2.1|com.sun.jbi.engine.bpel.BPELSEHelper|_ThreadID=49;_ThreadName=sun-bpel-engine-thread-0;Process Instance Id=192.168.191.63:7e7e6603:13b925ed4df:-33da;Service Assembly Name=RebillingCA;BPEL Process Name=HandlerITAN;_RequestID=08a52876-86b1-4432-865f-81f2ce0c5d1a;|BPJBI-6001: Sending ERROR status (Service Name = {urn:gf-rebilling:handler-itan}Itan, Endpoint Name = JMSInPortTypeRole_myRole, Operation Name = {urn:gf-rebilling:get-from-inner-queue-itan}JMSInOperation, Message Exchange Id = 103811251663452-9183-135746757484070139)
Error properties
com.sun.jbi.crl.faultcode = Server
com.sun.jbi.crl.faultstring = BPCOR-6135: A fault was not handled in the process scope; Fault Name is {http://docs.oasis-open.org/wsbpel/2.0/process/executable}selectionFailure; Fault Data is <?xml version=«1.0» encoding=«UTF-8»?><jbi:message xmlns:sxeh="http://www.sun.com/wsbpel/2.0/process/executable/SUNExtension/ErrorHandling&q... type=«sxeh:faultMessage» version=«1.0» xmlns:jbi="http://java.sun.com/xml/ns/jbi/wsdl-11-wrapper"><jbi:part>BPCOR... Selection Failure occurred in BPEL({urn:gf-rebilling:handler-itan}HandlerITAN) at line 68</jbi:part></jbi:message>. Sending errors for the pending requests in the process scope before terminating the process instance
com.sun.jbi.crl.faultactor = sun-bpel-engine
com.sun.jbi.crl.faultdetail =
BPCOR-6135: A fault was not handled in the process scope; Fault Name is {http://docs.oasis-open.org/wsbpel/2.0/process/executable}selectionFailure; Fault Data is <?xml version=«1.0» encoding=«UTF-8»?><jbi:message xmlns:sxeh="http://www.sun.com/wsbpel/2.0/process/executable/SUNExtension/ErrorHandling&q... type=«sxeh:faultMessage» version=«1.0» xmlns:jbi="http://java.sun.com/xml/ns/jbi/wsdl-11-wrapper"><jbi:part>BPCOR... Selection Failure occurred in BPEL({urn:gf-rebilling:handler-itan}HandlerITAN) at line 68</jbi:part></jbi:message>. Sending errors for the pending requests in the process scope before terminating the process instance
Caused by: BPCOR-6174: Selection Failure occurred in BPEL({urn:gf-rebilling:handler-itan}HandlerITAN) at line 68
BPCOR-6129: Line Number is 66
BPCOR-6130: Activity Name is InitParams|#]

dszn
() автор топика
Ответ на: комментарий от dszn

Проблема в этом блоке - Message Exchange Id = 103811251663452-9183-135746757484070139
Программа считает ее за дату. Каким образом это обойти?

dszn
() автор топика
Ответ на: комментарий от dszn

Если WARNING блоки не содержать подстроку «|INFO|», попробуйте следующий скрипт:

#!/bin/bash
DATE1=`date -d 2012-12-13T10:00:00.000+0400 +%s`
DATE2=`date -d 2012-12-13T11:00:00.000+0400 +%s`
while read LINE
do
    if [[ $LINE == *\|INFO\|* ]]
    then
        DATE3=$(date -d "`echo $LINE | cut -d\| -f2`" +%s)
        if [ $DATE3 -ge $DATE1 ] && [ $DATE3 -lt $DATE2 ]
        then echo $LINE
        fi
    fi
done

gorky ★★
()
Ответ на: комментарий от gorky

«В седьмой строке скрипта аргумент date -d надо окружить двойными кавычками.»
Можно объяснить для чего нужны двойные кавычки?

dszn
() автор топика
Ответ на: комментарий от dszn

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

date -d 2015-01-01 10:00 +%s
date: лишний операнд "+%s"
вываливается с ошибкой, потому что аргументом параметра -d считается только «2015-01-01», а «10:00» считается аргументом команды date, который указывает формат даты. Поэтому «+%s» получается лишним аргументом.

Когда аргумент окружается двойными кавычками, он обрабатывается правильно.

date -d "2015-01-01 10:00" +%s
1420074000

gorky ★★
()
Ответ на: комментарий от gorky

А это скрипт для вывода WARNING блоков. Все переводы строк съедаются.

#!/bin/bash
DATE1=`date -d 2012-12-13T10:00:00.000+0400 +%s`
DATE2=`date -d 2012-12-13T11:00:00.000+0400 +%s`
while read -d \] LINE
do
    if [[ $LINE == *\|WARNING\|* ]]
    then
        DATE3=$(date -d "`echo $LINE | cut -d\| -f2`" +%s)
        if [ $DATE3 -ge $DATE1 ] && [ $DATE3 -lt $DATE2 ]
        then echo $LINE\]
        fi
    fi
done

gorky ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.