0

我们使用 IIS 6 来提供静态内容并路由到另一台服务器上动态生成的页面。现在我们想添加一些可以在整个请求中遵循的日志记录,因此对于每个请求,我们想要:

  • 生成唯一 ID(UUID 或类似的),
  • 使用生成的 ID 打印到某种类型的日志,
  • 在将生成的 ID 传递到我们的后端服务器时将其添加到请求标头(这样我们也可以在那里跟踪日志)。

我可以使用某种类型的脚本吗?还是我需要构建某种类型的插件?(我不知道我有什么选择以及从哪里开始。)

4

1 回答 1

0

我发现的唯一方法是在 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 中。仍然需要获取日志行(或在某些低优先级过滤器中修改重定向日志行)并让标题正常工作。

于 2013-11-05T07:33:09.340 回答