我们使用 IIS 6 来提供静态内容并路由到另一台服务器上动态生成的页面。现在我们想添加一些可以在整个请求中遵循的日志记录,因此对于每个请求,我们想要:
- 生成唯一 ID(UUID 或类似的),
- 使用生成的 ID 打印到某种类型的日志,
- 在将生成的 ID 传递到我们的后端服务器时将其添加到请求标头(这样我们也可以在那里跟踪日志)。
我可以使用某种类型的脚本吗?还是我需要构建某种类型的插件?(我不知道我有什么选择以及从哪里开始。)
我发现的唯一方法是在 C 中创建一个 ISAPI 过滤器。我还没有完成,但到目前为止,我已经设法将此过滤器加载到 IIS 中(使用 MSVC2010 Express+Win7.1 SDK 编译):
#include <windows.h>
#include <httpfilt.h>
#include <stdio.h>
#pragma warning(disable:4996)
BOOL WINAPI GetFilterVersion(PHTTP_FILTER_VERSION pVer)
{
const char* desc = "Some filter, version 0.1";
pVer->dwFilterVersion = HTTP_FILTER_REVISION;
pVer->dwFlags = SF_NOTIFY_PREPROC_HEADERS | SF_NOTIFY_ORDER_HIGH;
strncpy(pVer->lpszFilterDesc, desc, SF_MAX_FILTER_DESC_LEN);
return TRUE;
}
DWORD WINAPI HttpFilterProc(PHTTP_FILTER_CONTEXT pfc, DWORD NotificationType, LPVOID pvNotification)
{
char uuid[50];
if (NotificationType == SF_NOTIFY_PREPROC_HEADERS)
{
PHTTP_FILTER_PREPROC_HEADERS lHeaders = (PHTTP_FILTER_PREPROC_HEADERS)pvNotification;
GUID guid;
CoCreateGuid(&guid);
_snprintf(uuid, sizeof(uuid), "{%08X-%04hX-%04hX-%02X%02X-%02X%02X%02X%02X%02X%02X}", guid.Data1, guid.Data2, guid.Data3, guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]);
// ToDo: print the UUID in the log as well.
lHeaders->AddHeader(pfc, "Log-Request-ID:", uuid);
}
return SF_STATUS_REQ_NEXT_NOTIFICATION;
}
并将它们导出到 .def 文件中:
LIBRARY "log_request_filter"
EXPORTS
GetFilterVersion
HttpFilterProc
DLL 现在加载到 IIS6 中。仍然需要获取日志行(或在某些低优先级过滤器中修改重定向日志行)并让标题正常工作。