Автоматическая очистка логов 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%system32LogFiles и в Windows Server 2008 / 2012 /R2 в папке %SystemDrive%inetpublogsLogFiles.
В случае исчерпания свободного места на системно диске, администратор судорожно пытается найти чем забит диск, и благополучным образом не обращает внимание на каталог inetpub, т.к. на первый взгляд его размер незначителен. Проблема в том, что по умолчанию у администратора нет прав на просмотр стандартных каталогов внутри папки inetpub, и таким образом проводник Windows не показывает реальный размер вложенных папок.
Если попытаться открыть каталог %SystemDrive%inetpublogsLogFiles, подтверждая назначение необходимых разрешений (или запустить проводник с правами администратора), можно увидеть, что на самом деле размер папки с логами довольно велик.
Как правило, можно безопасно удалить все файлы логов старше 3-7 дней. Это можно сделать вручную (не самый лучший вариант), либо автоматически с помощью скрипт PowerShell который будет удалять старые лог файлы по расписанию.
Простой PowerShell скрипт, который будет рекурсивно удалять файлы с расширением *.log из каталога C:inetpublogs может быть таким:
gci ‘C:inetpublogs -Include ‘*.log’ -Recurse | ? LastWriteTime -LT (Get-Date).AddDays(-7) | Remove-Item
Для автоматического запуска скрипта можно создать такое задание в планировщике (Task Scheduler):
- Запустите Task Scheduler
- В правой панели Action щелкните по Create Basic Task
- Укажите имя задания: CleanIISLog
- Настроим задание на еженедельный запуск по субботам
- Запускаемая программа: powershell.exe
- Аргументы: —NoProfile -command «gci ‘C:inetpublogs’ -Include ‘*.log’ -Recurse | ? LastWriteTime -LT (Get-Date).AddDays(-7) | Remove-Item»
- Теперь откройте свойства созданного задания
- Укажите, что задание будет запускаться из-под Системы (NT AUTHORITYSystem) и поставьте чекбокс Run with highest privileges
- Протестируйте задание, щелкнув по нему ПКМ и выбрав Run
- Убедитесь, что все лог файлы старше 7 дней автоматически удалены
Совет. Еще один способ «быстро» уменьшить размер логов, когда удалять их по каким-то причинам нельзя – включить NTFS сжатие на каталоге с логами. Т.к. логи представляют собой простые текстовые файлы, жмутся они довольно сильно (в 4 -5 раз). Чтобы включить NTFS компрессию, откройте свойства папки с логами и нажмите на кнопку Advanced. Отметьте галку Compress contents to save disk space и дважды нажмите OK.
Windows Server 2012
Автоматическая очистка логов IIS с помощью PowerShell