You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过ServerManager API编程配置IIS事件日志生成ETW条目?

使用ServerManager配置IIS事件日志与ETW条目

核心逻辑

IIS的事件日志及ETW追踪配置,对应ServerManager操作applicationHost.config中的tracing相关节点。要生成指定事件的ETW条目,重点是配置失败请求追踪规则或服务器级ETW提供器,以下是具体实现方案。

具体代码实现

1. 前置准备

确保项目已引用Microsoft.Web.Administration库:

  • 可通过NuGet安装Microsoft.Web.Administration包
  • 或直接引用系统路径C:\Windows\System32\inetsrv\Microsoft.Web.Administration.dll

2. 站点级失败请求追踪(含ETW配置)

针对单个站点配置,仅追踪该站点的指定事件并生成ETW条目:

using Microsoft.Web.Administration;
using System.Linq;

using (var serverManager = new ServerManager())
{
    // 替换为你的目标站点名称
    const string targetSite = "YourSiteName";
    var site = serverManager.Sites[targetSite];
    if (site == null) throw new InvalidOperationException($"站点 {targetSite} 不存在");

    // 获取站点专属配置
    var siteConfig = site.GetWebConfiguration();
    var tracingSection = siteConfig.GetSection("system.webServer/tracing");

    // 启用失败请求追踪基础配置
    tracingSection["enabled"] = true;
    tracingSection["directory"] = @"%SystemDrive%\inetpub\logs\FailedReqLogFiles";
    tracingSection["maxLogFiles"] = 100;

    // 操作失败请求追踪规则集合
    var traceRules = tracingSection.GetCollection("traceFailedRequests");
    var existingRule = traceRules.FirstOrDefault(r => r["path"].ToString() == "*");

    if (existingRule == null)
    {
        // 创建新规则:匹配所有请求
        var newRule = traceRules.CreateElement();
        newRule["path"] = "*";

        // 添加WWW Server ETW提供器,指定要追踪的事件领域
        var providers = newRule.GetCollection("traceAreas/add");
        var etwProvider = providers.CreateElement();
        etwProvider["provider"] = "WWW Server";
        etwProvider["areas"] = "Authentication,Security,StaticFile,Cache,RequestNotifications";
        etwProvider["verbosity"] = "Verbose";
        providers.Add(etwProvider);

        // 设置触发条件:比如状态码500或请求耗时超30秒
        var failureDef = newRule.GetChildElement("failureDefinitions");
        failureDef["statusCodes"] = "500";
        failureDef["timeTaken"] = "00:00:30";

        traceRules.Add(newRule);
    }
    else
    {
        // 更新已有规则的ETW配置
        var providers = existingRule.GetCollection("traceAreas/add");
        var etwProvider = providers.FirstOrDefault(p => p["provider"].ToString() == "WWW Server");
        if (etwProvider != null)
        {
            etwProvider["areas"] = "Authentication,Security,StaticFile,Cache,RequestNotifications";
            etwProvider["verbosity"] = "Verbose";
        }
        else
        {
            var newEtwProvider = providers.CreateElement();
            newEtwProvider["provider"] = "WWW Server";
            newEtwProvider["areas"] = "Authentication,Security,StaticFile,Cache,RequestNotifications";
            newEtwProvider["verbosity"] = "Verbose";
            providers.Add(newEtwProvider);
        }
    }

    // 保存配置变更
    serverManager.CommitChanges();
}

3. 服务器级全局ETW配置

在服务器层面开启全局ETW追踪,覆盖所有站点:

using Microsoft.Web.Administration;
using System.Linq;

using (var serverManager = new ServerManager())
{
    // 获取服务器根配置(applicationHost.config)
    var globalConfig = serverManager.GetApplicationHostConfiguration();
    var tracingSection = globalConfig.GetSection("system.applicationHost/tracing");
    tracingSection["enabled"] = true;

    // 操作ETW提供器集合
    var etwProviders = tracingSection.GetCollection("ETWProviders");
    var existingProvider = etwProviders.FirstOrDefault(p => p["name"].ToString() == "WWW Server");

    if (existingProvider == null)
    {
        // 添加WWW Server ETW提供器(固定GUID)
        var newProvider = etwProviders.CreateElement();
        newProvider["name"] = "WWW Server";
        newProvider["guid"] = "{3a2a4e84-4c21-4981-ae10-3fda0d9b0f83}";
        newProvider["areas"] = "Authentication,Security,StaticFile,Cache,RequestNotifications";
        newProvider["verbosity"] = "Verbose";
        newProvider["enabled"] = true;
        etwProviders.Add(newProvider);
    }
    else
    {
        // 启用并更新已有提供器配置
        existingProvider["enabled"] = true;
        existingProvider["areas"] = "Authentication,Security,StaticFile,Cache,RequestNotifications";
        existingProvider["verbosity"] = "Verbose";
    }

    serverManager.CommitChanges();
}

注意事项

  • 权限要求:运行代码的进程必须拥有管理员权限,否则无法修改IIS配置
  • ETW提供器GUID:不同IIS组件的GUID固定,可通过命令logman query providers查询所有可用提供器
  • 配置验证:修改后可通过IIS管理器查看对应设置,或执行appcmd list config /section:system.webServer/tracing命令验证生效情况

内容的提问来源于stack exchange,提问作者aoven

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 07:20:02