Главная

Sunday, 24 December 2017

LogParser, выборка строк по индексу одним запросом.

Всем привет.

А я говорил что бесплатный LogParser может быть весьма полезен.  При правильном его использовании.

Ситуация следующая: в журнале FTP надо выбрать записи касающиеся передачи ночного бекапа базы данных. Но не просто строку где было установлено соединение,  но также строку о его успешном завершении. Например из следующего фрагмента в результат должны попасть и "Opening data connection" и "Transfer Complete".

Фрагмент ftpzip.log:
...
Local directory now E:\backup_db\DB.
ftp> lcd e:\backup_db\DB
mput *.zip
200 PORT Command OK
150 Opening data connection for db1506190314.zip (12.168.1.53,4108)
226 Transfer Complete
ftp: 2276702207 bytes sent in 180,45Seconds 12616,52Kbytes/sec.
ftp> ftp>
cd \
250 Directory successfully changed to "/"
и т.д.

Оказывается, в LogParser в это можно сделать одним запросом! Строки вызова LogParser помещаем в любой пакетный файл:

-- куда поместить вывод запроса
set Output = "D:\test\base\Out"
-- откуда берем данные
set Input  = "D:\test\base\MyDB\ftpzip.log"
-- сам запуск LogParser-а
LogParser.exe file:FTPQuery.sql?Path=%Input%+Out=%Output% -o:CSV -fileMode:0

А вот и наш FTPQuery.sql. Весь фокус в том что все строки при обрабокте LogParser-ом имеют индекс. Поэтому чтобы получить три строки подряд нам надо согласно шаблона '%db15% по имени файла бекапа выбрать еще две строки ниже, т.е. те у которых индекс будет отличаться на +1 и +2 соответственно:

Select LogFileName, Index, Text
 INTO '%Out%\ftpzip.res'
 FROM '%Path%'
 WHERE Index in (
  SELECT add(Index,2)
  FROM '%Path%'
  WHERE (Text like '%db15%'))
  OR
  Index in (
  SELECT add(Index,1)
  FROM '%Path%'
  WHERE (Text like '%db15%'))
  OR
  Index in (
  SELECT Index
  FROM '%Path%'
  WHERE (Text like '%db15%'))

И имеем результат.
LogFilename,Text
D:\test\_base\DB\ftprar1.log,17,"150 Opening data connection for db1506190314.zip (12.168.1.53,4108)"
D:\test\_base\DB\ftprar1.log,18,226 Transfer Complete
D:\test\_base\DB\ftprar1.log,19,"ftp: 2276702207 bytes sent in 180,45Seconds 12616,52Kbytes/sec.
...

Успехов.

No comments:

Post a Comment

А что вы думаете по этому поводу?