Управление ведением журнала сценариев PowerShell

Опубликовано: 16 Марта, 2023
Управление ведением журнала сценариев PowerShell

Я пишу много сценариев PowerShell. Некоторые из сценариев, которые я разрабатываю, предназначены для одноразовых задач, а другие выполняются ежедневно. Всякий раз, когда я создаю сценарий, который будет часто запускаться, мне нравится встраивать механизм ведения журнала сценария PowerShell, чтобы я мог вернуться позже и убедиться, что сценарий делает то, что должен делать. Тем не менее, ведение журнала создает свои собственные проблемы.

Во-первых, возникает вопрос, как лучше регистрировать данные. Некоторые люди предпочитают использовать командлет Start-Transcript, в то время как другие предпочитают использовать Out-File или что-то еще. На мой взгляд, универсального решения для ведения журнала не существует. Каждый сценарий уникален, поэтому, когда дело доходит до ведения журнала сценариев PowerShell, лучше всего выводить данные любым методом, наиболее подходящим для текущей задачи.

Вопрос о том, какой метод следует использовать для регистрации данных, уже давно горячо обсуждается. Однако есть один аспект обсуждения ведения журналов сценариев PowerShell, который часто упускается из виду — распространение журналов. Проблема со встраиванием возможностей ведения журнала в часто запускаемые сценарии заключается в том, что эти сценарии могут со временем генерировать огромный объем данных журнала. Если журналы добавляются к существующему файлу журнала, в конечном итоге вы можете получить огромный файл. Если вы создаете отдельный файл журнала каждый раз, когда запускается сценарий, вы можете получить большое количество файлов журнала.

Мой совет: по возможности записывайте данные журнала в уникальный файл. Таким образом, вы также можете автоматизировать удаление старых файлов журналов. Вот как это работает.

Создание уникальных имен файлов

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

Для целей этого примера давайте представим, что я хочу создать ежедневный журнал для определенного сценария PowerShell. Если бы это была реальная ситуация, я бы, вероятно, создал выходные файлы, которые отражали бы имя сценария (чтобы я знал, какой сценарий создал журнал) и текущую дату. Для примера я буду использовать сокращенную версию даты, но если вы обеспокоены тем, что ваш сценарий может запускаться более одного раза в день, вы можете включить время в имя файла.

Вот как бы я создал такое имя файла:

$RootName = 'Журнал'
$LogDate = Get-Date -Format d
$FileName = $RootName + $LogDate + '.txt'

Первая строка кода устанавливает переменную с именем $RootName и присваивает ей текстовую строку, которая просто говорит Log. Здесь вы могли бы использовать имя вашего скрипта, если бы вы запускали его по-настоящему.

Вторая строка кода присваивает текущую дату переменной с именем $LogDate. Есть две вещи, которые стоит упомянуть об этом. Во-первых, вы заметите, что я использовал параметр -Format, за которым следует строчная буква D. Это говорит PowerShell использовать краткое представление даты. Вы можете найти доступные параметры форматирования здесь.

Еще одна вещь, о которой стоит упомянуть, это то, что также можно использовать переменную $LogDate для записи даты в содержимое файла журнала.

Последняя строка кода создает переменную с именем $Filename, основанную на переменных $RootName и $LogDate. Вы также заметите, что я добавил к имени файла расширение.txt. Я добавил эти три строки кода в скрипт вместе со строкой, которая выводит имя файла. Вы можете увидеть результаты на рисунке ниже.

Удаление старых журналов

Как видите, относительно легко создавать файлы журналов, имена которых основаны на дате, но как насчет удаления старых файлов журналов? Если ваш скрипт все равно работает на регулярной основе, вы можете добавить несколько строк кода для удаления старых файлов журнала. Предположим, например, что ваши файлы журналов находятся в папке с именем C:Logs, и вы хотите удалить эти файлы журналов через 30 дней. Вы можете определить старые файлы журнала с помощью этой команды:

Get-ChildItem “C:Logs*.txt” | Where LastWriteTime -LT (Get-Date).AddDays(-30)

Часть команды Get-ChildItem извлекает содержимое определенной папки с файлами. В этом случае он извлекает файлы.TXT из папки C:Logs. Часть команды WhereLastWriteTime указывает PowerShell фильтровать список файлов на основе времени последнего изменения файла. В этой ситуации мы используем фильтр даты. Командлет Get-Date извлекает текущую дату. AddDays обычно используется для расчета даты в будущем, но поскольку я указал отрицательное число (-30), команда просматривает день в прошлом. Другими словами, Get-ChildItem извлекает список файлов.TXT в папке C:Logs, которые в последний раз записывались более 30 дней назад (оператор -LT означает «меньше чем» и указывает, что мы хотим искать файлы старше указанного диапазона дат).

Если вы посмотрите на рисунок ниже, вы увидите, что я использовал команду Dir для получения списка всех текстовых файлов в текущей папке. Затем я использовал команду, указанную выше, чтобы показать, какие из этих текстовых файлов старше 30 дней. Если бы я хотел автоматизировать удаление этих файлов, я мог бы использовать командлет Remove-Item.

Быть организованным

Большая часть ведения журналов сценариев PowerShell — это организованное создание файлов журналов и удаление старых файлов журналов, которые больше не нужны. К счастью, PowerShell позволяет очень легко сделать и то, и другое. На самом деле вы, возможно, даже заметили, что когда я идентифицировал старые файлы журнала, команда, которую я использовал, основывалась на атрибуте файла LastWriteTime, а не на имени файла. Этот метод будет работать, даже если имя файла не было основано на дате создания.