Вместо предисловия отмечу, что у программы FreeFileSync имеется очень подробное руководство пользователя. Настоятельно рекомендую с ним ознакомиться, прежде чем приступать к творчеству файлового бэкапинга.
Дошли-таки руки до резервного копирования файлового хранилища объёмом в 1,2 терабайта. Всего в хранилище пылится порядка 2 миллионов файлов, которые надо бы куда-то бэкапить и, желательно, сохранять удалённые файлы вместе со всей иерархией.
Хранение я организовал на платформе OpenMediaVault, которая позволяет держать на файловой шаре корзину и строить иерархию для удалённого файла. Всё, что нужно — сервер с парой raid-массивов. По привычке: один массив под систему, второй — под хранение данных.
Кстати, корзину в OpenMediaVault можно легко реализовать в настройках общих ресурсов SMB. Например, в моём случае настройки выглядят так:
Таким образом, мы даём понять системе, что не накладываем совершенно никаких ограничений на размер файла в корзине, но при этом ограничиваем хранение файлов в ней. Я установил 60 дней. Думаю, в моём случае этого должно хватить. Кроме этого, нужно снять галчонка с опции скрытия файлов с точкой в имени файла. Не забываем сохранить настройки и применить их.
После всех этих операций в общей шаре для резервного хранилища появится папка-корзина, куда будут складываться удалённые файлы. Иерархия в папке построена так, что каждый удалённый файл будет хранится в папке с именем пользователя от чьего имени было инициировано удаление.
Теперь вернёмся к нашим бэкапам… Итак! На сервер с файлохранилищем ставим FreeFileSync. Проводим сравнение хранилищ, зеркалим данные и обнаруживаем, что во время копирования получили кучу ошибок. Вот только лог программы построен таким образом, что разделить информационные каналы нельзя. В итоге, пользователь получает простынь с данными, которую приходится отдельно и долго анализировать. Человеко-часы… Айяяй!
Так вот! Оказывается, что всё это время я только подходил к теме сегодняшнего поста! А сегодня я расскажу про метод простого парсинга журнала FreeFileSync с использованием PS1.
По умолчанию, журнал FreeFileSync сохраняется в красочный html. Правда, информационные изображения в структуре документа должны подгружаться с сервера программы. В моём случае, оба хранилища изолированы и выхода в глобалку им не светит. Так как, отчёт всё равно остаётся без картинок — переделаем формат лога в обычный текстовый документ формата log.
Для этого настройки программы нужно привести к такому виду:

И, конечно, самое вкусное на десерт. Потратив часик (где-то так) я накастовал простенький скрипт, который парсит файл лога и отправляет сообщения об ошибках в другой файл. Обратите внимание, что я указал пути так, словно лог и скрипт находятся в одной папке.
Я думаю, что изолировать скрипт от основных файлов журнала программы и копировать нужный лог в файл in.log — это правильный подход к черновой работе с логами.
Код скрипта:
# Укажите путь к лог-файлу и выходному файлу
$inputFilePath = "in.log"
$outputFilePath = "errors.txt"
# Чтение содержимого лог-файла
$content = Get-Content $inputFilePath -Encoding UTF8
# Массив для хранения ошибок
$errors = @()
# Поиск и фильтрация сегментов
foreach ($segment in $content -join "`n" -replace '\r\n', "\n" -split '(?=\[\d+:\d+\:\d+\])')
{
if ($segment -match 'Ошибка')
{
$errors += $segment
}
}
# Запись найденных ошибок в выходной файл
if ($errors.Count -gt 0)
{
$errors | Set-Content $outputFilePath
Write-Host "Ошибки успешно извлечены в файл $outputFilePath"
}
else
{
Write-Host "Ошибки не найдены."
}
# Ожидание ввода от пользователя
Read-Host "Нажмите Enter для завершения..."
Скрипт переборчиком пробегается по тексту, полирует переносы строк, разделяет его на сегменты по таймкоду и ищет там страшное слово Ошибка. В финале все найдёныши складываются в отдельный файл errors.txt.
Кстати, самая популярная ошибка, которую мне доводилось видеть во время бэкапинга с помощью FreeFileSync — слишком длинное имя целевого файла. Если Вам повезёт и подобных ошибок будет пара-тройка — можно отследить виновников в ручном режиме и дать файлам корректные имена, а вот, что делать, если таких файлов больше? Намного больше…
