Вопрос или проблема
Я использовал Apache на протяжении многих лет и принимал как должное, что он сам обрабатывает ротацию логов. Я копался в конфигурации IIS и гуглил, но не могу найти опцию для IIS, чтобы включить ротацию логов.
Каков предпочтительный способ настройки IIS для удаления логов после определенного порога? Есть ли какие-либо продукты, которые делают это за вас? Что делают крупные компании на Windows?
Конфигурация: IIS 6.0 / Windows Server 2003 32-bit
Встроенного механизма для обработки ротации логов или архивирования нет. Возможно, существуют сторонние продукты, которые могут выполнить эту задачу, или вы могли бы написать скрипт и настроить запланированную задачу. У меня всего несколько серверов IIS, поэтому я просто настроил повторяющуюся задачу в Outlook, чтобы напоминать мне каждый месяц удалять файлы логов IIS старше 30 дней.
Проверьте: http://www.700c.dk/?code-iis-log-housekeeping
Доступно множество скриптов, которые вы можете добавить в запланированную задачу = ротация логов 🙂
Обратите внимание на инструмент IIS Logs (http://www.iislogs.com/). Существует несколько различных способов установки этого инструмента, и он очень эффективно управляет логами IIS и другими лог-файлами (сжимает файлы в формат .zip, перемещает их в другие места, удаляет файлы старше определенной даты и т.д.).
Настройте запланированную задачу для использования robocopy для копирования файлов в подкаталог с названием “old”. У него есть параметр /minage:x, который вы можете установить на 30, 60 или сколько угодно. Затем удалите все в этом каталоге. Я делаю это на паре десятков серверов, и, похоже, это работает.
Другие ответы хорошие и предлагают более надежное решение этой проблемы. Если вам просто нужно быстрое решение, вы можете настроить CCleaner для автоматической очистки вашей папки логов каждый раз при входе в систему или по расписанию.
Тем не менее, имейте в виду, что это удаляет все логи, а не только устаревшие файлы.
Я следовал этим инструкциям, но добавил, что хочу, чтобы он запускался даже когда пользователь вышел из системы, как это обычно бывает на сервере.
Недавно я задал этот тот же вопрос на форуме Powershell.org. Затем я опубликовал хак скрипта для Desired State Configuration, который я буду использовать для решения проблемы с ротацией логов. Возможно, некоторый код будет полезен другим.
# Требуется диск E:.
configuration LogDirectory
{
param (
[Parameter(Mandatory)]
[ValidateNotNullOrEmpty()]
[string[]]$Node
)
node $Node
{
Script LogDirectoryScript
{
GetScript = {
$result = (Test-Path 'E:\log') -and (schtasks.exe /query /TN Purge_Log_Folder | Select-String Purge_Log_Folder -Quiet)
return @{
GetScript = $GetScript
SetScript = $SetScript
TestScript = $TestScript
Result = $result
}
}
SetScript = {
Write-Verbose 'Создание каталога логов.'
if ( -not (Test-Path 'E:\log')) {
New-Item -ItemType Directory -Path 'E:\log'
}
Write-Verbose 'Изменение прав доступа к каталогу логов так, чтобы любой пользователь мог записывать, но только администратор мог читать или изменять.'
$acl = (Get-Item 'E:\log').GetAccessControl('Access')
$acl.AddAccessRule((New-Object System.Security.AccessControl.FileSystemAccessRule('Users','Write', 'Allow')))
Set-Acl -Path 'E:\log' -AclObject $acl | Out-Host
Write-Verbose 'Запланирован процесс очистки.'
$script="Get-ChildItem E:\log\* -Include ex*.log -Recurse | Where-Object {$_.LastWriteTime -lt (Get-Date).AddDays(-7)} | Remove-Item"
Set-Content -Path C:\Windows\Purge_Log_Folder.ps1 -Value $script
$task = 'Powershell.exe -NoProfile -ExecutionPolicy RemoteSigned -File C:\Windows\Purge_Log_Folder.ps1'
SCHTASKS /CREATE /TN Purge_Log_Folder /TR $task /SC DAILY /ST 23:59 /RU SYSTEM /F | Out-Host
Write-Verbose 'Настройка IIS'
# Параметры лог-файлов по умолчанию для веб-сайтов <logFile>
# http://www.iis.net/configreference/system.applicationhost/sites/sitedefaults/logfile
Import-Module WebAdministration
Set-WebConfigurationProperty '/system.applicationHost/sites/siteDefaults' -name logFile -value @{
directory = 'E:\log'
localTimeRollover="true"
period = 'Hourly'
}
}
TestScript = {
(Test-Path 'E:\log') -and (schtasks.exe /query /TN Purge_Log_Folder | Select-String Purge_Log_Folder -Quiet)
}
}
}
}
LogDirectory
Вы можете сделать это с помощью запланированной задачи и пакетного файла.
forfiles -p "C:\Path\To\Log\Files" -m *.* /D -30 /C "cmd /c del @path"
Я использую ниже приведенный пакетный скрипт Windows для сжатия, а затем удаления файлов логов.
Примечание: требуется программное обеспечение 7zip https://www.7-zip.org/download.html.
@echo off
:: обрабатывать файлы старше 1 дня
FORFILES /P C:\PATH\TO\LOGS\ /D -1 /M *.log /C "cmd /c ^0x22C:\Progra~1\7-Zip\7z.exe^0x22 a ^[email protected]^0x22 ^0x22@path^0x22 -sdel"
:: обрабатывать файлы старше 6 дней
FORFILES /P C:\PATH\TO\LOGS\ /D -6 /M *.log /C "cmd /c ^0x22C:\Progra~1\7-Zip\7z.exe^0x22 a ^[email protected]^0x22 ^0x22@path^0x22 -sdel"
Создайте запланированную задачу для запуска вышеуказанного пакетного скрипта по желаемому расписанию, желательно в полночь.
Используя PowerShell (удалить все лог-файлы IIS старше 90 дней):
Get-Website |
ForEach-Object {
Get-ChildItem -Path ([System.Environment]::ExpandEnvironmentVariables($_.logFile.directory + '\W3SVC' + $_.id + '\')) -File |
Where-Object { $_.CreationTime -le (Get-Date).AddDays(-90) } |
Remove-Item -Force
}
Как запланированная задача:
Программа / скрипт: %SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe
Добавьте аргументы: -NoProfile -NonInteractive -ExecutionPolicy Bypass -Command "Get-Website | ForEach-Object { Get-ChildItem -Path ([System.Environment]::ExpandEnvironmentVariables($_.logFile.directory + '\W3SVC' + $_.id + '\')) -File | Where-Object { $_.CreationTime -le (Get-Date).AddDays(-90) } | Remove-Item -Force }"
IIS 7 вводит конфигурацию для периодической очистки двоичных лог-файлов. Для получения дополнительной информации посмотрите на period
по следующей ссылке:
http://www.iis.net/configreference/system.applicationhost/log/centralbinarylogfile
Ответ или решение
Настройка IIS для ротации логов может вызывать трудности, особенно если вы привыкли к автоматической ротации логов в Apache. В случае с IIS 6.0 и Windows Server 2003, встроенной функции для ротации логов не существует. Однако, существуют различные подходы, которые можно использовать для автоматизации этой задачи. Давайте рассмотрим несколько из них.
1. Скрипты для автоматизации ротации логов:
Вы можете создать скрипт, который будет автоматически удалять логи старше определенного срока. Это можно сделать с помощью PowerShell или batch-файла. Ниже представлены примеры для обоих подходов.
Пример PowerShell сценария для удаления логов старше 90 дней:
Get-Website |
ForEach-Object {
Get-ChildItem -Path ([System.Environment]::ExpandEnvironmentVariables($_.logFile.directory + '\W3SVC' + $_.id + '\')) -File |
Where-Object { $_.CreationTime -le (Get-Date).AddDays(-90) } |
Remove-Item -Force
}
Создание задачи в планировщике:
- Программа/скрипт:
%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe
- Аргументы:
-NoProfile -NonInteractive -ExecutionPolicy Bypass -Command "Get-Website | ForEach-Object { Get-ChildItem -Path ([System.Environment]::ExpandEnvironmentVariables($_.logFile.directory + '\W3SVC' + $_.id + '\')) -File | Where-Object { $_.CreationTime -le (Get-Date).AddDays(-90) } | Remove-Item -Force }"
2. Использование планировщика задач Windows:
Для ротации логов можно использовать планировщик задач, который будет выполнять ваш скрипт по расписанию. Создайте задачу, которая будет запускать ваш скрипт (например, вышеуказанную PowerShell команду) каждый день в определенное время, например, в 23:59.
3. Сторонние инструменты:
- IIS Logs Tool: Это программное обеспечение может эффективно управлять логами IIS, позволяя сжимать файлы, перемещать их в другие местоположения и удалять файлы, достигшие определенной даты. Информацию о продукте можно найти на IIS Logs Tool.
4. Скрипты на Batch:
Если вы предпочитаете использовать batch-файлы, ниже приведен пример, который бесплатно использует команду forfiles
для удаления файлов старше 30 дней:
forfiles -p "C:\Path\To\Log\Files" -m *.* /D -30 /C "cmd /c del @path"
Этот скрипт можно добавить в планировщик задач, чтобы он выполнялся автоматически.
5. Инструменты для компрессии и удаления:
Вы также можете использовать инструменты, такие как 7-Zip, для автоматической компрессии и удаления логов. Вот пример batch-скрипта для этого:
@echo off
:: компрессия файлов старше 1 дня
FORFILES /P C:\PATH\TO\LOGS\ /D -1 /M *.log /C "cmd /c \"C:\Program Files\7-Zip\7z.exe\" a \"C:\Path\To\Archive\@fname.7z\" \"@path\" -sdel"
Заключение:
Хотя IIS не предоставляет встроенных возможностей для автоматической ротации логов, описанные выше методы позволят вам эффективно управлять логами на ваших серверах. Использование PowerShell или планировщика задач делает процесс более автоматическим и снижает риск переполнения дискового пространства старыми логами. Выбор между созданием собственных скриптов и использованием сторонних инструментов зависит от ваших предпочтений и требований к управлению логами.