IIS 6为日志和标头生成请求ID

时间:2013-11-04 09:41:02

标签: iis logging request iis-6

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

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

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

1 个答案:

答案 0 :(得分: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中加载。仍然要获取日志行(或修改某些lower-prio过滤器中的重定向日志行)并使标头正常工作。