Часть полного текста документа:Программируем под IIS на Visual C++ Одной из распространенных задач администрирования web-сайтов является анализ log-файлов и сбор данных из них. Поговорим об этой задаче на примере IIS 5.0 (Internet Information Service). В связи с тем, что данный HTTP сервер поддерживает несколько форматов таких файлов (формат W3C, формат NCSA, а также свой формат IIS), анализ log-файлов превращается в довольно трудоемкую задачу. Кроме того для формата W3C список полей может конфигурироваться, что задачу не облегчает. Но к счастью вместе с IIS 5.0 в составе прочих компонентов, поставляется компонент MSWC.IISLog, который предназначен для получения данных из log-файлов и предоставляет для этой цели интерфейс ILogScripting. Находится он в файле %windir%system32inetsrvlogscrpt.dll. С помощью этого интерфейса можно читать данные из log-файла, записывать прочтенные данные в другой файл. Перед тем как начать работу с какими-либо log-файлом, его нужно открыть. Для этого служит метод OpenLogFile: HRESULT OpenLogFile( [in] BSTR szLogFileName, [in] IOMode Mode, [in] BSTR szServiceName, [in] long iServiceInstance, [in] BSTR szOutputLogFileFormat), где в параметре szLogFileName задается полный путь к файлу; параметр Mode может принимать следующие значения: ForReading - файл будет открыт для чтения ForWriting - файл будет открыт для записи; в параметре szServiceName задается название службы, которой был создан данный файл (например "W3SVC"); парметр iServiceInstance указывает номер экземпляра сервера данной службы (напр. 1); в параметре szOutputLogFileFormat задается название формата, в котором будут читаться или записываться данные (например "W3C"). Если метод выполнился успешно то возвращается 0. Для чтения данных из файла служит метод ReadLogRecord: HRESULT ReadLogRecord(), который читает строку из текущей файловой позиции и перемещает позиционер файла дальше. Мы можем получить эти данные в виде значений конкретных полей с помощью множества методов, которые возвращают эти значения: get_DateTime Отображение даты и времени по Гринвичу (GMT) get_ServiceName Отображение имени службы get_ServerName Отображение имени сервера get_ClientIP Отображение имени узла клиента get_UserName Отображение имени пользователя get_ServerIP Отображение IP-адреса сервера get_Method Отображение типа операции get_URIStem Отображение адреса URL get_URIQuery Отображение всех параметров, передаваемых с запросом get_TimeTaken Отображение общего времени обработки get_BytesSent Отображение числа переданных байтов get_BytesReceived Отображение числа полученных байтов get_Win32Status Отображение кода состояния Win32 get_ProtocolStatus Отображение состояния протокола get_ServerPort Отображение номера порта get_ProtocolVersion Отображение строки версии get_UserAgent Отображение строки агента пользователя get_Cookie Отображение имени Cookie клиента get_Referer Отображение страницы источника ссылки get_CustomFields Отображение массива специальных заголовков Все эти методы имеют один формат: HRESULT get_MethodName(VARIANT *pValue). В параметре pValue будет возвращено интересующее нас значение. Если значение запрашиваемого параметра равно "-", то тип pValue будет VT_EMPTY. Если же по каким-то причинам параметр не будет найден в log-файле (напр. параметр отключен, или текущая строка - незначащая), то тип pValue будет VT_NULL. Для того, чтобы мы сильно не увлеклись существует метод AtEndOfLog, который подобно привычному feof возвращает (или не возвращает :)) признак достижения конца файла и выглядит приблизительно так: HRESULT AtEndOfLog([out, retval] VARIANT_BOOL* pfEndOfRead) В параметре pfEndOfRead, собственно, и возвращается интересующий нас признак, что позволяет нам все таки когда-нибудь завершить обработку log-файла. ............ |