Статьи

Настройка очистки файла журнала по расписанию для серверов Windows, работающих под управлением IIS

В наши дни в IIS установлено так много наворотов, что может быть трудно найти панель настроек, которая делает то, что вы от нее хотите (или если вы такой же парень, как IIS 5/6, как я, вы можете просто потеряться раз). Единственное, чего не хватает в качестве функции в IIS, — это переработка файлов журнала. Если вы управляете установкой IIS любого приличного размера, вы из первых рук узнаете, как быстро файлы журнала могут заполнить жесткий диск сервера и поставить его на колени, если с ним не справиться должным образом — как мне позаботиться об этом?

В чем проблема?

IIS создает новый файл журнала каждый день и заполняет его информацией о каждом запросе, который он обслуживал.

Пример файла журнала:

2011-01-22 00:00:00 192.168.1.1 GET /1893/1181.png - 80 - 118.208.178.247 Mozilla/5.0+(Windows;+U;+Windows+NT+5.1;+en-US;+rv:1.9.2.13)+Gecko/20101203+Firefox/3.6.13+(+.NET+CLR+3.5.30729) 404 0 2 562
2011-01-22 00:00:00 192.168.1.1 GET /1894/1180.png - 80 - 118.208.178.247 Mozilla/5.0+(Windows;+U;+Windows+NT+5.1;+en-US;+rv:1.9.2.13)+Gecko/20101203+Firefox/3.6.13+(+.NET+CLR+3.5.30729) 200 0 0 593
2011-01-22 00:00:00 192.168.1.1 GET /1894/1181.png - 80 - 118.208.178.247 Mozilla/5.0+(Windows;+U;+Windows+NT+5.1;+en-US;+rv:1.9.2.13)+Gecko/20101203+Firefox/3.6.13+(+.NET+CLR+3.5.30729) 200 0 0 593
2011-01-22 00:00:00 192.168.1.1 GET /1892/1180.png - 80 - 118.208.178.247 Mozilla/5.0+(Windows;+U;+Windows+NT+5.1;+en-US;+rv:1.9.2.13)+Gecko/20101203+Firefox/3.6.13+(+.NET+CLR+3.5.30729) 404 0 2 593

В зависимости от типов сайтов, которые вы размещаете, вам может понадобиться хранить эти файлы журналов только в течение определенного периода времени, например, 30 или 60 дней. Очевидно, вам нужно взвесить это число в зависимости от ваших обстоятельств, принимая во внимание все возможные причины, по которым вы, возможно, захотите  сохранить  свои файлы журналов:

  • Запускаете ли вы программы статистики трафика, требующие от ваших журналов более 60 дней, чтобы увидеть тренды и т. Д.?
  • Нужно ли вам хранить журналы в течение определенного периода времени для проведения аудита безопасности в случае хакера / порчи?

В большинстве случаев я считаю, что 30–60 дней — это оптимальное время для хранения файлов журналов IIS ваших серверов, так как в случае инцидента, такого как вторжение в систему безопасности, вы будете знать, что вам нужно просмотреть журналы до того, как в любом случае, это 60-дневный период, так как в большинстве случаев будет совершенно ясно, что что-то произошло, и что ваш файл журнала нуждается в проверке, задним числом (очевидно, это не лучший способ узнать о вторжении, но я говорю от контекст управления файлами журналов).

Таким образом, решение, которое нам действительно нужно, — это способ удаления старых журналов IIS один раз в день в зависимости от даты их последнего изменения. Эта простая функциональность была бы отличной маленькой функцией для добавления в IIS, но в ее нынешнем виде не похоже, что это произойдет в ближайшее время.

Потенциальное решение

Много лет назад, когда я работал над управлением сетевой инфраструктурой, я столкнулся с простым VBScript, написанным парнем, который работал под именем просто  MAK  , с тех пор я видел много мест — я потерял сайт оригинальных авторов, так что если Вы знаете об этом, дайте мне знать, комментируя ниже. Что нужно сделать, это взять каталог (и его рекурсивные дочерние элементы), число, обозначающее самые старые файлы, которые будут храниться по количеству дней, и путь к файлу журнала, в который будут записаны все его выходные данные.

Начните с копирования приведенного ниже сценария в блокнот и сохранения его как  LogFileCleaner.vbs . Вы можете поместить это в любом месте, если вы обновите любые пути, показанные ниже в дальнейших шагах.

Для ясности я буду размещать мой по пути  C: \ LogCleaner \

' Objective: To delete old files from a given folder and all subfolders below
'
' Created by: MAK June 21, 2005
'
' Format: cscript deloldfiles.vbs {DriveLetter:\FolderName} {#ofDays}
'     or: cscript deloldfiles.vbs {\\servername\FolderName} {#ofDays}
' Example: cscript deloldfiles.vbs c:\dba\log 3
'    (deletes files older than 3 days from the \dba\log file on drive C:)
Set objArgs = WScript.Arguments
FolderName =objArgs(0)
Days=objArgs(1)

set fso = createobject("scripting.filesystemobject")
set folders = fso.getfolder(FolderName)
datetoday = now()
newdate = dateadd("d", Days*-1, datetoday)
wscript.echo "Today:" & now()
wscript.echo "Started deleting files older than :" & newdate 
wscript.echo "________________________________________________"
wscript.echo ""
recurse folders 
wscript.echo ""
wscript.echo "Completed deleting files older than :" & newdate 
wscript.echo "________________________________________________"

sub recurse( byref folders)
  set subfolders = folders.subfolders
  set files = folders.files
  wscript.echo ""
  wscript.echo "Deleting Files under the Folder:" & folders.path
  wscript.echo "__________________________________________________________________________"
  for each file in files
    if file.datelastmodified < newdate then
      wscript.echo "Deleting " & folders.path & "\" & file.name & " last modified: " & file.datelastmodified
      on error resume next
' === to test this script but not actually delete files, comment out the next line ===
    file.delete
    end if
    
  next  

  for each folder in subfolders
    recurse folder
  next  

  set subfolders = nothing
  set files = nothing

end sub

Теперь создайте пакетный файл, который вызывает этот VBScript со всеми путями, в которых вы храните файлы журналов, и сохраните его как CleanLogs.bat  в той же папке, в которой вы создали вышеупомянутый VBScript.

Мой пример ниже устанавливает дату файла границы 60 дней назад и указывает на папку журнала iis по  умолчанию (C: \ inetpub \ logs \ LogFiles) . Это удалит все файлы журнала старше 60 дней.

cscript c:\logcleaner\LogFileCleaner.vbs C:\inetpub\logs\LogFiles 60 >> c:\logcleaner\cleaner_log.log

Сохранить этот файл

Теперь нам нужно запланировать запуск этого пакетного файла, поэтому откройте планировщик заданий и щелкните в правой части меню пункт « Создать базовое задание ».

образ

В новых окнах введите имя для вашей новой запланированной задачи — на снимке экрана ниже я называю мой  «Очистка журнала IIS»  и нажимаю «  Далее».

образ

Установите триггер для выполнения вашей задачи как  Ежедневно  и нажмите «  Далее»  (это может быть установлено любое расписание, которое вы хотите, однако я буду запускать мое каждый день)

 образ

Теперь введите время, когда вы хотите, чтобы этот файл журнала очищался каждый день — я установил мой на 12:00. Затем нажмите Далее

 образ

Выберите « Запустить программу » и нажмите «  Далее».

 образ

Теперь нажмите «  Обзор»  и перейдите к BAT-файлу, который мы создали выше @  c: \ logcleaner \ cleanlogs.bat,  и когда закончите, нажмите «  Далее».

На следующей странице установите флажок « Открыть диалоговое окно Свойства для этой задачи, когда я нажму кнопку Готово», а затем нажмите кнопку Готово.

образ

В новом окне нажмите кнопку с пометкой  Изменить пользователя или группу  рядом с областью параметров безопасности диалогового окна. Это позволяет нам указать, от какого пользователя будет запускаться задача.

образ

Введите пользователя  SYSTEM  и нажмите ОК

образ

Нажмите  OK еще  раз, и все готово!

Не стесняйтесь запускать задачу вручную, щелкнув ее правой кнопкой мыши и выбрав «  Выполнить»

В качестве альтернативы вы можете изменить созданный на первом шаге сценарий vbscript, закомментировав строку, которая выполняет удаление, — это позволит вам запустить задачу и увидеть в файле журнала все файлы, которые будут удалены, если запускать без этой строки, закомментированной.

А теперь попробуйте какой-нибудь вкусный напиток и порадуйтесь (надеюсь), что на вашем сервере снова не останется свободного места из хранилища файлов журнала.

Некоторые идеи, чтобы пойти домой

Если вам не нравится идея «удалять» ваши файлы журналов каждые 60 дней, и вместо этого вы просто хотите переместить их из пути к файлам журналов, вы можете легко изменить приведенный выше скрипт, чтобы скопировать ваши журналы где-то вне сервера для архивации.

Кроме того, если вы используете мое  расписание резервного копирования SQL EXPRESS в соответствии с моим предыдущим сообщением , вы можете использовать вышеприведенное также для очистки устаревших резервных копий базы данных, которые я создаю, так что любая резервная копия старше, чем, скажем, неделя или две, будет удалена.