Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Парсинг логов с конца и резолвинг того что получилось (http://forum.oszone.net/showthread.php?t=334165)

Elven 05-04-2018 18:03 2807244

Парсинг логов с конца и резолвинг того что получилось
 
Есть изрядная пачка логов (все в одной папке, у всех расширение txt, кроме этих логов больше ничего в папке нету) в одной из последних десяти строк каждого лога есть IP (в какой именно из этих десяти неизвестно, первые два октета во всех логах одинаковые, кроме IP в этой строке может быть разве что несколько пробелов). Вообще можно и все логи и целиком читать, но они здоровые весьма, и IP могут встречаться и ранее, а нужно именно последнее значение.
Нужно выдернуть IP и положить в новый общий лог (например, IP.log) вместе с именем старого лога. Как-то так
Код:

192.168.1.1 log1
192.168.1.2 log2

Еще нужно спросить у DNS'a все ли нормально отрезолвилось, и те IP, для которых DNS имени не вернул сложить в отдельный лог (например nonameIP.log).
Вроде все описал, если что уточнить нужно - пишите.

Iska 05-04-2018 18:19 2807251

Цитата:

Цитата Elven
Вообще можно и все логи и целиком читать, »

Вообще, так оно всегда и происходит, поскольку именно так работает последовательный доступ к файлам — построчное чтение от начала файла к концу.


Цитата:

Цитата Elven
в одной из последних десяти строк »

…и только в одной? А может такое — IP вообще не окажется?

Elven 05-04-2018 18:44 2807253

Iska, только в одной из. И окажется. Если так уж сильно хочется то можно взять последние двадцать, но нужности нет. В последних 10 строчках будет IP.

Цитата:

Цитата Iska
построчное чтение от начала файла к концу »

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

Busla 06-04-2018 09:44 2807350

Elven, и в линуксе тоже нельзя. Просто вы воспринимаете утилиту tail как волшебство, а по факту она прочитывает файлы от начала и до конца.

В итоге: у вас какие-то конкретные трудности, или это сообщение из ряда: "Сделайте за меня скрипт, а я зарплату за это буду получать"?

Kazun 06-04-2018 10:07 2807354

Код:

dir *.txt | Foreach {
        $Name = $_.Name
        (gc $_.FullName -Tail 10 -Raw).split() -match "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}" | % {"{0}`t{1}" -f $Name,$_}
}


Elven 06-04-2018 10:17 2807355

Busla, лишней зарплаты я за это точно не получу. Просто задолбало руками лазить и искать по всем логам то, что нужно найти (поиск по содержимому - в ту же степь).
Kazun, спасибо, отсюда и буду колупать.

Казбек 06-04-2018 11:09 2807374

Elven,

Возможно, будет интересно. В это консольной утилиты большие возможности по парсингу различных логов - Log Parser 2.2
Ссылки с примерами:
  1. Using Log Parser to Query Event Log Data
  2. Log Parser examples: Using the free log analysis tool
  3. Log Parser Examples

Iska 06-04-2018 14:02 2807402

Цитата:

Цитата Elven
В линуксе можно, учитывая что все знать невозможно - предположил, что аналогичная фича есть в виндах, только я о ней не знаю. »

Elven, как верно заметил коллега Busla:
Цитата:

Цитата Busla
и в линуксе тоже нельзя. »

Чтобы найти десять последних строк — надо прочитать все строки, посчитать их количество и взять десять последних. Ни в какой операционной системе тут отличий нет, поскольку это общий принцип. Именно так работает tail в Unix, её портированные версии в Windows, параметр -Tail в командлете Get-Content PowerShell'а.

Казбек, я тоже первым делом вспомнил про Log Parser, но есть подозрение, что там в логах какая-то не структурированная информация. Так-то, как обычно: «Эх… получить бы образцы»™.

DJ Mogarych 06-04-2018 14:48 2807412

Слегка через одно место, но работает.
Powershell:
Код:

$fs = dir C:\Temp\log
foreach ($f in $fs)
{
$c = gc $f.FullName -last 10 | sls "192.168"
$f.Name,$c.Line
}


Elven 06-04-2018 14:49 2807413

Казбек, я знаю о существовании логпарсера, но не думаю что применить его в этом случае получится.
Iska, очень сильно не структурированная. Если так уж сильно хочется то вот пример лога, но не думаю, что это сильно поможет.
кусок лога
Код:

06.04.2018 12:04:45,70
 10.47.6.112
 192.168.209.1
 192.168.10.1
 00-24-1D-A8-8A-19
 00-50-56-C0-00-01
 00-50-56-C0-00-08
------------
ПОЛЬЗОВАТЕЛЬ          СЕАНС              ID  СТАТУС  БЕЗДЕЙСТВ. ВРЕМЯ ВХОДА
 pivanov              console            1  АКТИВНО отсутствует 04.04.2018 9:04
-----------------------------------------------

Интересует адрес начинающийся с 10.47.

Iska 06-04-2018 16:43 2807437

Elven, конечно, поможет.

1. Я вот, например, вижу по логу, что вопреки сказанному:
Скрытый текст
Цитата:

Цитата Elven
в одной из последних десяти строк »

Цитата:

Цитата Iska
…и только в одной? »

Цитата:

Цитата Elven
Iska, только в одной из. »


наличествует несколько IP.

2. Позволяет наглядно понять, что работать с ним как с реляционной базой данных (Log Parser, OLEDB Text Driver) не получится.

DJ Mogarych 06-04-2018 16:50 2807439

Собственно, помимо наколеночных скриптов есть два, на мой взгляд, более правильных пути:
1) Организовать отчёты той софтиной, что генерирует эти логи, если она сама не наколеночная.
2) Поднять какой-нибудь Zabbix, чтобы он смотрел в эти логи и выдавал предупреждения и слал письма в случае обнаружения заданного паттерна.

Elven 09-04-2018 10:59 2807849

DJ Mogarych, наколенная, писаная хз когда и кем, так что концов не собрать. Zabbix и так есть, но о том, что должно получаться нет нужности слать письма, нужно просто формировать отчет периодически по требованию (от нескольких раз в неделю до раза в полгода).
Iska, IP который нужен начинается на 10.47. и он - один. При указании этого всего я несколько некорректно выразился, нужный IP - один, и первые два октета у него всегда одни и те же.

Собственно первая часть выполнена, за основу взял то, что предложил Kazun.

Код:

dir *.txt | Foreach {
        $Name = $_.BaseName
        (gc $_.FullName -Tail 10).split() -match "10.47.\d{1,3}\.\d{1,3}" | foreach {"{0}`t{1}" -f $_,$Name}
}

Осталось то что получилось прогнать через Resolve-DnsName, однако для решения этой проблемы мне нужен только аналог && и || в cmd/bat для PowerShell.

Elven 09-04-2018 12:06 2807858

Получилось как-то так. Может и писано и криво, но работает, меня устраивает.
Код:

$datetime = Get-Date -Format yyyyMMdd_HHMMss
dir *.txt | Foreach {
        $Name = $_.BaseName
        (gc $_.FullName -Tail 10).split() -match "10.47.\d{1,3}\.\d{1,3}" | foreach {
        "{0}`t{1}" -f $_,$Name | Format-List | Out-File "e:\$datetime IP.txt" -Append
        Resolve-DnsName $_ >$null
        if ($? -eq "False") {$_ | Format-List | Out-File "e:\$datetime noresolvIP.txt" -Append}
        }
}


Iska 09-04-2018 16:23 2807901

Цитата:

Цитата Elven
Iska, IP который нужен начинается на 10.47. и он - один. При указании этого всего я несколько некорректно выразился, нужный IP - один, и первые два октета у него всегда одни и те же. »

Elven, тогда другое дело :).


Время: 09:55.

Время: 09:55.
© OSzone.net 2001-