Автоматичне очищення логів IIS за допомогою PowerShell

Веб сервер IIS (Internet Information Services) в процесі роботи генерує досить велика кількість балок, які пишуться в файли журналів. Основна проблема в тому, що за замовчуванням журнали IIS розташовані на системному диску, і згодом лог-файли можуть забити все доступне місце на диску і робота сервера буде паралізована. Наприклад, в моєму випадку на Exchange Server 2013 з майже 1000 ящиків, IIS генерує за день лог-файл порядком 200 Мб. Таким чином, за рік, лог-файли IIS будуть займати 70 Гб дискового простору. Чи можна якось керувати цим процесом?

В IIS відсутня будь-яка вбудована процедура ротації логів IIS, тому адміністраторам доводиться вигадувати власні схеми для автоматичної ротації або видалення журналів IIS на веб серверах.

В першу чергу адміністратор повинен в принципі вирішити, чи потрібні взагалі логи, які генерує IIS. Якщо питання негативна - ведення журналів логів можна відключити в налаштуваннях сайту в консолі Internet Information Services (IIS) Manager в розділі Logging. В деяких випадках також застосуємо перенесення файлів журналів з системного диска на диск з даними / виділений диск. Для цього в тому ж розділі досить змінити шлях до каталогу LogFiles.

Так по-замовчуванню, в Windows Server 2003 логи IIS зберігаються в папці%windir% \ system32 \ LogFiles \ і в Windows Server 2008/2012 / R2 в папці % SystemDrive% \ inetpub \ logs \ LogFiles \.

У разі вичерпання вільного місця на системно диску, адміністратор судорожно намагається знайти ніж забитий диск, і благополучним чином не звертає увагу на каталог inetpub, тому що на перший погляд його розмір незначний. Проблема в тому, що за замовчуванням у адміністратора немає прав на перегляд стандартних каталогів всередині папки inetpub, і таким чином провідник Windows не вказує реальний розмір вкладених папок.

Якщо спробувати відкрити каталог% SystemDrive% \ inetpub \ logs \ LogFiles, підтверджуючи призначення необхідних дозволів (або запустити провідник з правами адміністратора), можна побачити, що насправді розмір папки з логами досить великий.

Як правило, можна безпечно видалити всі файли логів старше 3-7 днів. Це можна зробити вручну (не найкращий варіант), або автоматично за допомогою скрипт PowerShell який буде видаляти старі лог файли за розкладом.

Простий PowerShell скрипт, який буде рекурсивно видаляти файли з розширенням * .log з каталогу C: \ inetpub \ logs може бути таким:

gci 'C: \ inetpub \ logs -Include' * .log '-Recurse | ? LastWriteTime -LT (Get-Date) .AddDays (-7) | Remove-Item

Для автоматичного запуску скрипта можна створити таке завдання в планувальнику (Task Scheduler):

  1. запустіть Task Scheduler
  2. У правій панелі Action клацніть по Create Basic Task
  3. Вкажіть ім'я завдання: CleanIISLog
  4. Налаштуємо завдання на щотижневий запуск по суботах
  5. Запускається програма: powershell.exe
  6. аргументи: -NoProfile -command «gci 'C: \ inetpub \ logs' -Include '* .log' -Recurse | ? LastWriteTime -LT (Get-Date) .AddDays (-7) | Remove-Item »
  7. Тепер відкрийте властивості створеного завдання
  8. Вкажіть, що завдання буде запускатися з-під Системи (NT AUTHORITY \ System) і поставте чекбокс Run with highest privileges
  9. Протестуйте завдання, клацнувши по ньому ПКМ і вибравши Run
  10. Переконайтеся, що всі лог файли старше 7 днів автоматично видалені

Порада. Ще один спосіб "швидко" зменшити розмір логів, коли видаляти їх з якихось причин не можна - включити NTFS стиснення на каталозі з балками. Оскільки логи є текстові файли, тиснуться вони досить сильно (в 4 -5 разів). Щоб включити NTFS компресію, відкрийте властивості папки з логами і натисніть на кнопку Advanced. відзначте галку Compress contents to save disk space і двічі натисніть OK.