Забрать логи по FTP батч-файлом [решено]

Обсуждение ПО и его настройки
Ответить
Akina
Сообщения: 33
Зарегистрирован: 13 июл 2018, 07:46
Откуда: Зеленоград, Москва, Россия
Контактная информация:

Имеется в сети единственный маршрутизатор, который раздаёт кучу разного трафика, включая Интернет. Соответственно пишет достаточно много логов. Поднимать лог-сервер (да даже FTP) снаружи как-то не хотелось, да и опять же два узла менее надёжны, чем один. SD-карта не резиновая, её хватает где-то на 2 недели, а дальше нужно копировать с неё логи да чистить. Когда надоело делать это руками, написал батч-файл, засунул в планировщик сервера - пусть работает.

Вот, решил поделиться, вдруг да пригодится кому. Решение уже отработало 3 месяца без сбоев. При работе из внешних инструментов используются только штатный ftp.exe и архиватор 7-zip.

Все логи, которые нужно сохранять, пишутся в один файл логов с именем по шаблону firewall_log.???.txt (потом, когда нужно, их разбором, делением по типам и анализом занимается отдельная программа). Количество файлов логов установлено в 1000, средний размер файла 2-3 Мбайт. Решено забирать логи, когда их количество перевалит за 450 (это где-то гигабайт текстовых файлов, которые потом прекрасно сжимаются в архив размером 8-9 Мбайт). При удалении решено оставлять 10 самых свежих файлов, чтобы обеспечить перекрытие по событиям.

Код: Выделить всё

@echo off
setlocal
chcp 1251
:: Сгенерировать случайное имя для файла управления
set ftpscript=ftpscript_%random%.txt
:: Перейти в каталог, где находится пакетный файл
cd /d %~dp0
:: Если имеется файл в подкаталоге, куда копируются файлы с ФТП (при предыдущем запуске был какой-то сбой) - прервать работу
if exist .\FW_logs\*.txt goto :EOF
:: Проверить существование файла-маркера (firewall_log.450.txt), если есть - удалить
set filename=firewall_log.450.txt
if exist "%temp%\%filename%" del "%temp%\%filename%"
:: Создать файл управления для FTP.EXE
:: Отсутствие пробела между именем пользователя / паролем и символами перенаправления '>>' - важно!
echo open 10.0.0.226 > %temp%\%ftpscript%
echo ftpuser>> %temp%\%ftpscript%
echo FTP_console>> %temp%\%ftpscript%
echo cd disk1/FW_logs >> %temp%\%ftpscript%
echo prompt n >> %temp%\%ftpscript%
echo lcd %temp% >> %temp%\%ftpscript%
echo get %filename% >> %temp%\%ftpscript%
echo bye >> %temp%\%ftpscript%
:: Выполнить файл управления
ftp -s:%temp%\%ftpscript%
:: Удалить файл управления
del /q %temp%\%ftpscript%
:: Проверить, удалось ли загрузить файл, если нет (ещё не набрано логов, или ошибка)
if not exist "%temp%\%filename%" goto :EOF
del "%temp%\%filename%"
:: Создать каталог, куда копировать файлы с ФТП, если не существует
if not exist .\FW_logs md FW_logs
:: Создать файл управления для FTP.EXE
echo open 10.0.0.226 > %temp%\%ftpscript%
echo ftpuser>> %temp%\%ftpscript%
echo FTP_console>> %temp%\%ftpscript%
echo cd disk1/FW_logs >> %temp%\%ftpscript%
echo prompt n >> %temp%\%ftpscript%
echo lcd %~dp0\FW_logs  >> %temp%\%ftpscript%
echo mget *.* >> %temp%\%ftpscript%
echo mdelete firewall_log.??*.txt >> %temp%\%ftpscript%
echo bye >> %temp%\%ftpscript%
:: Выполнить файл управления
ftp -s:%temp%\%ftpscript%
:: Удалить файл управления
del /q %temp%\%ftpscript%
:: Заархивировать загруженные файлы
for /f "tokens=1-3 delims=." %%x in ("%date%") do (
	"C:\Program Files\7-Zip\7z" a -mx9 -ms=on -sdel .\FW_logs_%%z-%%y-%%x.7z .\FW_logs\
)
Теперь достаточно раз в несколько дней контролировать количество файлов на SD в Микротике. Если что-то пойдёт не так - два раза подряд при проверках увидим файлов over 450 штук, и надо смотреть, почему процесс не прошёл.


Ответить