如何通过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
相关产品推荐
相关产品推荐

