1 (изменено: Alex_12095, 2014-05-12 05:36:54)

Тема: Сравнение времени лога последней строки PowerShell

Добрый вечер!
Есть такой скрипт:


#выводит последнюю строку
$d= "get-content -path d:\logs\file.log | select-object -last 1" | powershell -command -
#Выбирает в последней строке с 6 по 11 символ
$OFS=""; $r= [string]"$d"[6..11]
#Текущее время формата hh:mm
$f= get-date -uformat %R
#Сравнение текущего времени и временем последней записи в файле
$e= new-timespan -start ($f) -end($r) 
#Вывод рез-та
 write-host $e

Данный скрипт находит в одном файле последнюю строчку выбирает с 6 по 11 символ(там содержится время формата hh:mm)
Далее, дата последней строки сравнивается с текущим временем, и выводит разницу во времени типа (hh:mm:ss).
Есть еще такой кусок кода:


$s= gci d:\logs\*smtppop*.log | % {if ((gc $_)[-1] -match 'Error') {'File {0} есть' -f $_} else {'File {0} нету' -f $_}}
$s

Этот код ищет 'Error' в последней строке лога, рез-тат: имя лога и слово есть или нет 'Error'.
Я пробовал модернизировать второй код под мою задачу, так как результат такого вида какого и необходим, но не могу найти решения как поставить условие на время, а именно если разница во времени >20 минут, то рядом с файлом вывести, например 'да', в остальных случаях 'нет'. Кол-во файлов заранее не известно.
Буду благодарен любой информации.

2

Re: Сравнение времени лога последней строки PowerShell

Alex_12095, пожалуйста, чуть более конкретики: пример лога, тип ошибки.
В остальном, если правильно понимаю Вашу проблему,  все сводится к получению разницы во времени между тем, который протоколируется и фактическим. Если так, то задача может быть решена примерно следующим образом:

New-TimeSpan ([Regex]"(\d+\:){2}\d+").Match((gc mylog.txt)[-1]).Value $(date -u %R:%S)

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

(gc mylog.txt)[-1]

в ход идет регулярное выражение:

(\d+\:){2}\d+

Текущая дата также обрабатывается с секундами:

date -u %R:%S

В сущности пример выше можно использовать как шаблон: что-то добавить, что-то отбросить. Другой вопрос насколько велик лог. Командлет Get-Content (или его альяс gc) едва ли подойдут для больших по объему логов, поэтому, если возникунут проблемы с чтением больших файлов, то лучше воспользоваться tail.

3

Re: Сравнение времени лога последней строки PowerShell

greg zakharov,
Пример лога:

Mar31 23:57 qwerty OK >> +OK 0 0
Mar31 23:57 qwerty OK >> QUIT
Mar31 23:57 qwerty OK >> +OK [XMail 1.27 POP3 Server] closing session

Ошибки такого типа:


Mar18 11:52 qwerty Error: Подключение не установлено, т.к. конечный компьютер отверг запрос....... 

Задача: в неизвестном кол-ве файлов в последних 10 строках найти ошибки: 'Error' эта задача выполнена

gci d:\logs\*smtppop*.log | % {if ((gc $_)[-1] -match 'Error') {'File {0} есть' -f $_} else {'File {0} нету' -f $_}}

, а так же в каждом из этих файлов  сравнить время последней строки с текущим временем, подготовить сообщение вида:


имя лога:       есть ли ошибка:          есть ли разница во времени:(20 минут)
asdf.log           ошибок нет                       разница есть
......              .......                           .......

Макс. размер лога 40 mb ~ полмиллиона строк, в принципе скорость работы "gc" устраивает

4

Re: Сравнение времени лога последней строки PowerShell

 
          #Текущее время
          $f=get-date -uformat %R
          #Берет имена логов и передает их  
          gci \\путь\*маска*.log | % {                                            
          #Поиск последней строки каждого из файлов
    $d= tail '\\путь\'$_{0}  
          #Выбирает в последней строке с 6 по 11 символ(там содержиться время)
       $OFS=""; $r= [string]"$d"[6..11]
        # Сравнение текущего времени и времени последней записи в файле
        $e= new-timespan -start ($f) -end($r) 
        #преобразование рез-та
        $OFW=""; $q= [string]"$e"[0..8]
if ($q -gt '-00:20:00')
    {
      '{0} Разница > 20' -f $_
    }
elseif ($q -eq '-00:20:00')
    {
      ' {0} Разница = 20' -f $_
    }
else
    {
      '{0} Все ок' -f $_
    }  

Подскажите пожалуйста в чем ошибка.
"Не удается обработать преобразование аргументов для параметра "NumberOfLines". Не удается преобразовать значение"