Как стать автором
Обновить

Вертим логи как хотим ― анализ журналов в системах Windows

Время на прочтение6 мин
Количество просмотров118K
Всего голосов 14: ↑14 и ↓0+14
Комментарии6

Комментарии 6

Если мы хотим получить ошибки и предупреждения из системного журнала, можно воспользоваться дополнительной фильтрацией при помощи Where-Object
Get-WinEvent… | Where-Object

Это, в целом, отвратительный способ. Через powershell в принципе очень удобно разбирать логи, но есть одна большая проблема. ОЧЕНЬ. МЕДЛЕННО. Основной вопрос там обычно — не как в логе что-то найти, а как сделать так, чтобы запросы отрабатывали за вменяемое время. А комбинация Get-WinEvent для получения большого массива данных с последующей фильтрацией через where — самый медленный способ, который можно придумать. Get-Eventlog работает в разы быстрее, если надо получить большой кусок данных. Get-Winevent — наоборот, если нужно сделать максимально узкую выборку. В итоге либо используем Get-Eventlog… | where-object, либо Get-Winevent с максимально ограничивающим фильтром.

вот всем я люблю PowerShell, да вот только скоростью работы далеко не всегда отличается. местами из-за того что тянет за собой дотнетовские фреймворки…
поэтому до сих пор люблю использовать cmd, vbs, всякий AutoIT с его dllcall (до сей и питона недорос) и в случае логов — Logparser. называйте меня ретроградом, но… :)
Куда он «тянет» и какие такие «фреймворки»?
PS удобен, быстр и прекрасен, нужно лишь соблюдать условия:
— любую фильтрацию делать параметрами коммандлета, будь-то лдап запросы, будь-то эвентлоги. Коммандлеты по работе с большим количеством данных всегда имеют фильтры для выьорки на стороне сервера. Глупо ведь жаловаться на SELECT * при запросе к DB? С PS такая же ситуация;
— по-минимуму использовать пайплайны, всегда использовать foreach() {} вместо Foreach-Object — каждый пайп — это кастинг любого типа в PSCustomObject, а зачем он для строк, например?
— при необходимости формирования больших строковых массивов и любых других массовых операций со строками использовать StringBuilder — строки неизменяемы и любая операция со строкой пораждает в памяти новую строку;
— использовать легкие потоки — runspace и параллелить свои задачи;
— использовать workflow без ScriptBlock и параллелить свои задачи;
— использовать нативные бинарники. PS — в первую очередь шелл и он прекрасно отправляет на вход любой утилите любые данные пайпом (пайп на бинарник не приводит к кастингу) и отлично забирает выхлоп. Для сложных и больших копирований/синхронизаций использую свой класс-обвязку для робокопи и быстрее врядли что-то может быть;
— хотеть профилировать свои скрипты, само быстрее оно не станет;
— не бояться писать свои коммандлеты на шарпе, если иначе ну совсем никак не справиться;
— отбросить ксенофобию.
В своё время стояла задача — получать инфу о сеансах с терминальной фермы. Нашёл подходящие командлеты в галерее технета и получил время опроса около минуты. Полез внутрь — там использовались объекты .net (ну и не просто так PS требует .net framework).
В итоге переписал на автоите с использованием wtsapi32.dll, получил скорость опроса менее секунды. Поскольку чукча ну совсем не программер, и вообще довольно ленив — отлаживать решение не стал, сделал как есть (подозреваю что на ps можно было сделать тоже самое). Благо получившийся бинарник не требовал дополнительной установки .net и славно работал на win7
В последствии сталкивался с подобным поведением, когда да, быстрее и эффективнее написать обвязку для бинарника, если его не хватает, чем использовать PS. Ну и сложилось в итоге так (у меня), что совсем что-то простое — cmd, относительно сложные одно-двух строчники — PS, для всего остального vbs и autoit.
В шарп потыкаться чуть глубже — в планах.
За советы спасибо большое, записал, пригодится, кармы нет плюсануть.
Для просмотра логов в режиме реального времени последнее время использую Configuration Manager Trace Log (cmtrace, ex trace32) из SCCM. Весьма удобно. Но, конечно, решение не для автоматизации и полноценного анализа
Я ковыряю логи уже постфактум, когда идет расследование. Уже лет пять пользуюсь Event Log Explorer. Функционала за глаза.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий