Войти

Показать полную графическую версию : [решено] Парсинг логов с конца и резолвинг того что получилось


Elven
05-04-2018, 18:03
Есть изрядная пачка логов (все в одной папке, у всех расширение 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
Вообще можно и все логи и целиком читать, »
Вообще, так оно всегда и происходит, поскольку именно так работает последовательный доступ к файлам — построчное чтение от начала файла к концу.

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

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

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

Busla
06-04-2018, 09:44
Elven, и в линуксе тоже нельзя. Просто вы воспринимаете утилиту tail как волшебство, а по факту она прочитывает файлы от начала и до конца.

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

Kazun
06-04-2018, 10:07
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
Busla, лишней зарплаты я за это точно не получу. Просто задолбало руками лазить и искать по всем логам то, что нужно найти (поиск по содержимому - в ту же степь).
Kazun, спасибо, отсюда и буду колупать.

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

Возможно, будет интересно. В это консольной утилиты большие возможности по парсингу различных логов - Log Parser 2.2 (https://technet.microsoft.com/en-us/library/ee692659.aspx)
Ссылки с примерами:

Using Log Parser to Query Event Log Data (https://www.sherweb.com/blog/using-log-parser-to-query-event-log-data/)
Log Parser examples: Using the free log analysis tool (https://searchsecurity.techtarget.com/tip/Log-Parser-examples-Using-the-free-log-analysis-tool)
Log Parser Examples (https://technet.microsoft.com/en-us/library/ee692659.aspx)

Iska
06-04-2018, 14:02
В линуксе можно, учитывая что все знать невозможно - предположил, что аналогичная фича есть в виндах, только я о ней не знаю. »
Elven, как верно заметил коллега Busla:
и в линуксе тоже нельзя. »
Чтобы найти десять последних строк — надо прочитать все строки, посчитать их количество и взять десять последних. Ни в какой операционной системе тут отличий нет, поскольку это общий принцип. Именно так работает tail в Unix, её портированные версии в Windows, параметр -Tail в командлете Get-Content PowerShell'а.

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

DJ Mogarych
06-04-2018, 14:48
Слегка через одно место, но работает.
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
Казбек, я знаю о существовании логпарсера, но не думаю что применить его в этом случае получится.
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
Elven, конечно, поможет.

1. Я вот, например, вижу по логу, что вопреки сказанному:
в одной из последних десяти строк »
…и только в одной? »
Iska, только в одной из. »
наличествует несколько IP.

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

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

Elven
09-04-2018, 10:59
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
Получилось как-то так. Может и писано и криво, но работает, меня устраивает.
$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
Iska, IP который нужен начинается на 10.47. и он - один. При указании этого всего я несколько некорректно выразился, нужный IP - один, и первые два октета у него всегда одни и те же. »
Elven, тогда другое дело :).




© OSzone.net 2001-2012