Скрипт анализа логов по доступу к сайту

Добрый день! Уважаемые читатели и гости портала. В конце ноября я наконец-то решил для себя поиграться с тем, чтобы по закрывать доступ к сайту различным ботам, парсерам, краулерам и всевозможным системам AI. Уже сейчас я вижу снижение нагрузки на 50% к базе данных и самому сайту и понимаю. что это работает. Каждый день я выделяю минут по 10-15 для анализа событий из журналов доступа к сайту. В среднем это от 150к до 200к строк. Так как была проведена огромная работа по блокировке, мне хотелось чтобы все эти события уже не отображались в файле. Делать вручную это неудобно, поэтому я написал простой скрипт, которым решил поделиться с вами.

Почитать мою борьбу по блокировке сетей Битерики и не только, можно по ссылке

Формирование списка исключений

В данный список у меня входят боты поисковых систем, которые я не блокирую, бота ИИ, SEO боты и им подобные, боты социальных сетей, хостингов, строки с кодом 403, так как это уже заблокировано. Вот текущий пример, но он постоянно расширяется.

  • 403
  • Nextcloud Server Crawler
  • TerraCotta
  • screeenly-bo
  • Googlebot-Image
  • perplexity.ai
  • PerplexityBot
  • perplexity
  • YandexBot
  • mazonbot
  • AhrefsBot
  • YandexImages
  • YandexUserproxy
  • Applebot
  • bingbot
  • Pinterestbot
  • HaloBot
  • YandexRenderResourcesBot
  • YandexUserproxy
  • Googlebot
  • YandexRCA
  • keys-so-bot
  • DuckDuckBot
  • SeznamBot
  • archive.org_bot
  • WebartexBot
  • DataForSeoBot
  • SERankingBacklinksBot
  • TelegramBot
  • Instapaper
  • YandexAccessibilityBot
  • «WordPress/
  • .well-known
  • YandexMetrika
  • DotBot
  • LinkupBot
  • ClaudeBot
  • DuckAssistBot
  • ZoominfoBot
  • NetcraftSurveyAgent
  • mj12bot
  • Twitterbot

Все это добро, я копирую в обычный текстовый файл с именем list.txt

Скрипт по очистке журналов доступа к сайту

  1. Первое, что делает скрипт, это берет файл с журналом доступа
  2. Далее Подгружается файл со списком для удаления из журнала
  3. Выгружается конечный файл с результатами обработки. Я делаю это в CSV, чтобы мне потом удобнее было его анализировать и фильтровать.
  4. Будет показан результат сколько строк было удалено

Данный скрипт проще всего запускать через PowerShell ISE

$xlsxPath = «C:Tempaccess_log»
$txtPath = «C:Templist.txt»
$outputPath = «C:Tempresult.csv»

# Проверяем существование файлов
if (-not (Test-Path $xlsxPath)) {
Write-Error «Файл XLSX не найден: $xlsxPath»
exit 1
}

if (-not (Test-Path $txtPath)) {
Write-Error «Текстовый файл не найден: $txtPath»
exit 1
}

# Получаем список слов для поиска
$searchPatterns = Get-Content $txtPath | Where-Object { $_ -match ‘S’ } | ForEach-Object { $_.Trim() }

Write-Host «Найдено шаблонов для поиска: $($searchPatterns.Count)»

# Создаем COM-объект Excel
try {
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$excel.DisplayAlerts = $false

$workbook = $excel.Workbooks.Open($xlsxPath)
$worksheet = $workbook.Worksheets.Item(1)

$usedRange = $worksheet.UsedRange
$rowCount = $usedRange.Rows.Count
$colCount = $usedRange.Columns.Count

Write-Host «Загружено строк: $rowCount»

# Переход по строкам снизу вверх (чтобы удаление не сбивало нумерацию)
$rowsToDelete = @()

for ($row = $rowCount; $row -ge 1; $row—) {
# Собираем все ячейки строки в одну строку
$rowContent = «»
for ($col = 1; $col -le $colCount; $col++) {
$cellValue = $worksheet.Cells.Item($row, $col).Text
$rowContent += «$cellValue «
}

# Проверка на совпадение с любым шаблоном
$found = $false
foreach ($pattern in $searchPatterns) {
if ($rowContent -match [regex]::Escape($pattern)) {
$found = $true
break
}
}

if ($found) {
$rowsToDelete += $row
}
}

# Удаляем строки
foreach ($row in $rowsToDelete) {
$worksheet.Rows($row).Delete() | Out-Null
}

Write-Host «Удалено строк: $($rowsToDelete.Count)»
Write-Host «Осталось строк: $($rowCount — $rowsToDelete.Count)»

# Сохраняем результат
$workbook.SaveAs($outputPath, 6) # 6 = CSV формат

# Закрываем
$workbook.Close($false)
$excel.Quit()

[System.Runtime.Interopservices.Marshal]::ReleaseComObject($worksheet) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($workbook) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()

Write-Host «Результат сохранен в: $outputPath» -ForegroundColor Green

} catch {
Write-Error «Ошибка при работе с Excel: $_»
exit 1
}

Для демонстрации беру логи с сервера за треть дня. На входе:

Найдено шаблонов для поиска: 37
Загружено строк: 52534
Удалено строк: 8242
Осталось строк: 44292
Результат сохранен в: C:Tempresult.csv

Согласитесь, что минус 20% от общего количество строк сделает более эффективным последующий анализ журналов доступа. Из приятного стало снижаться среднее время ответа при доступе к сайту. Ресурсы высвободились и серверу стало легче обслуживать настоящих посетителей.

Источник

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями: