【问题标题】:Azure Cloud Service: how to log IIS requestsAzure 云服务:如何记录 IIS 请求
【发布时间】:2014-01-23 11:45:17
【问题描述】:

我希望看到 http 请求到达我在 IIS 中的云服务时的内部结构。我查看了很多信息,但不太了解如何启用它。例如,this site 提供了一些有用的信息。在该页面之后,我所取得的成就是:

  1. 在 Visual Studio 中连接到我的云服务并更新了日志 目录传输时间为 1 分钟(我尝试了不同的缓冲区 大小,但没有效果)。


  2. 在 Visual Studio 中选择了云服务并选择查看诊断数据。然后在 Windows Azure 日志中选择 IIS 日志 目录:


  3. 此时我收到 404 错误:


所以,虽然我已经设置了接收日志文件的可能性,但它们实际上并没有被生成。如果我可以在不重新部署的情况下完成这一切,那将是理想的,但我认为我可能需要在 web.config 中启用某些东西——只是不确定是什么。我已经阅读了this answer 中提供的链接,但是除了我已经完成的工作之外,找不到我真正需要启用的内容。任何指针都会很棒,如果更容易的话,很乐意尝试不同的(非 IIS)方法。

更新

因此,根据 MikeWo 和 kwill 的有用建议,我做了一些进一步的挖掘工作。首先,我确保存储帐户配置正确。似乎确实如此,首先因为这是我用于我的 Web 应用程序的相同帐户,其中用户上传的文件正确出现,其次因为我使用与 IIS 相同的过程启用了基础架构日志,并且日志出现了:

这让我觉得一开始就没有生成 IIS 日志。所以,我使用远程桌面连接到服务器。使用 IIS 管理器,我首先查看了服务器的日志记录:

日志文件位置不存在。因此,似乎该文件夹甚至还没有创建,并且这里没有记录任何内容。 接下来,我查看了我网站的日志记录:

在这种情况下,有日志文件,但它们来自一个多月前。最后,我按照 here 和 here 的说明操作,希望能够提高网站的日志记录级别。

appcmd set config /section:httpLogging /dontLog:False
appcmd.exe set config "<mysite>" -section:system.webServer/httpLogging /dontLog:"false" /commit:apphost
appcmd.exe set config "<mysite>" -section:system.webServer/httpLogging /selectiveLogging:"LogAll" /commit:apphost

命令成功,但这似乎没有效果,我没有看到任何更多的日志出现在我的 IIS 文件夹中。

然后我尝试了:

appcmd set config /section:httpLogging /dontLog:False /commit:WEBROOT

并收到:

说明:无法读取配置节“system.webServer/httpLogging”,因为它缺少节声明

我不太热衷于更改服务器上的配置文件,但如果我能得到一些保证,我会走上正确的道路。此外,我意识到这些变化不会持续存在,但我只是想看看我是否能得到任何工作。

这些是 Visual Studio 中的诊断设置,它使用与我的应用程序相同的存储帐户,可以正常工作:

很明显,IIS 诊断文件出现在要传输到存储的正确位置:

解决方案

kwill's answer最终让我走上了正轨。 IIS 文件夹确实存在,但最后一个日志来自一个多月前。我添加了一个虚拟文件,它出现在 blob 中。我将添加一个单独的问题,说明为什么没有更新 IIS 日志。

【问题讨论】:

    标签: asp.net iis azure


    【解决方案1】:

    Mike 的回答非常适合 WAD 故障排除。但是对于您的具体问题,假设您按照 Mike 的回答正确配置了存储帐户,您只需要等待更长的时间。在 IIS 释放对文件的锁定之前,WAD 不会传输 IIS 日志,这通常不会在一个小时内发生(直到 IIS 在一小时开始使用新的日志文件)。

    如果您在诊断存储中获取其他数据(即您看到您的日志或性能计数器数据),那么您知道存储帐户设置正确。

    路径应为 C:\Resources\Directory{DeploymentID}.{Rolename}.DiagnosticStore(请参阅 here)。如果您将基础架构日志写入您的存储帐户,那么您必须拥有该文件夹,因为这是诊断配置和缓存文件所在的位置。

    【讨论】:

    • 非常感谢,我会耐心等待找到的。
    • 我实际上是在一夜之间启用了日志记录,但什么也没出现。根据我的更新,我做了更多的分析,但运气不佳。
    • 如果您部署一个新的默认 WebRole 并将目录传输周期设置为 1 分钟,那么您会发现 C:\Resources\.DiagnosticStore 文件夹确实存在,并且生成并传输了 IIS 日志到存储。如果该文件夹在您的部署中不存在,那么就会发生一些非常奇怪的事情,因为只要您打开诊断,该文件夹就是由来宾代理创建的。您可以在 C:\config 中查看最新的 XML 文件,并确保定义了 DiagnosticStore 本地存储资源。
    • 实际上,如果您要获取基础架构日志,则该文件夹必须存在。我猜你的 IIS 配置发生了一些事情来更改日志位置。
    • 嗯,这很奇怪。直到今天,当我尝试更新中列出的步骤时,我才更改服务器上的任何内容。也许我需要重新映像?
    【解决方案2】:

    我要检查的第一件事是您为诊断数据设置的存储帐户的连接字符串。如果看起来正确,接下来我会使用存储工具查看存储帐户,以确保创建了 WAD-IIS-LogFiles 容器。这是 Windows Azure 诊断 (WAD) 删除文件的位置。您可以使用 Visual Studio 的服务器资源管理器中的存储工具,或免费的 Cerebrata Azure Explorer 之类的其他工具(由于我为 Cerebrata 工作,所以我有偏见,但有很多存储工具可供选择)。

    我的猜测是您收到“ContainerNotFound”异常,因为它不在存储帐户中。它应该在传输发生时自动创建,因此这让我相信传输不会发生,要么是因为缺少数据可放在那里,要么是配置错误。

    设置中的缓冲区大小就是您希望在各个本地实例上留出多少空间来缓冲稍后传输的数据。您可以为所有诊断配置最大空间量。您需要确保此缓冲区有一个值,并且它与您放入其中的目录配额的总和相同。在您的示例中,三个不同的目录有 1024 个,但目录总数为 NONE 缓冲区。这应该是 3072 对于您在这里的内容。

    正如@kwill 在下面的评论中指出的那样,缓冲区是为传输日志而保留的本地空间,并且值 None 是可以接受的。在此处为那些可能无法通过 cmets 阅读以查看更正的人添加了编辑。

    在传输期间,数据将复制到存储帐户。请注意,如果您的网站看到大量流量并生成大量诊断数据,则一分钟的传输时间非常激进。每分钟传输大量数据确实会增加计算机上的资源负载,并占用分配给您将数据移动到存储帐户的一些带宽。

    此外,您还可以通过服务器资源管理器插件、API 或其他工具远程更改诊断。当您执行此操作时,API 会将值写入 BLOB 存储,实例上的 WAD 代理会轮询以查看更改。这不应该需要重新部署,也不应该导致机器的回收;但是,WAD 代理确实需要一点时间才能接受更改。您可以使用公开它的工具将该值配置得更低(VS Explorer 没有)。

    【讨论】:

    • 澄清几点。 WAD 配额非常混乱,并且没有很好的记录。目录的缓冲区值只是为记录传输的文件而保留的本地空间量。这是您可以在 WADDirectoriesTable 中看到的数据。此设置与目录配额大小无关,通常可以是一个非常小的值。此外,'none' 或 0 的值基本上意味着“不设置显式配额,只使用OverallQuotaInMB 中剩余的空间”,因此 none 的值是有效的。
    • 感谢您对目录配额的更正和澄清!
    • 感谢详细信息,我会做一些实验,看看我发现了什么。我同意 1 分钟过于激进,但我只需要它来跟踪特定请求,然后我会关闭。
    • 根据我的更新,我做了更多分析,但运气不佳。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    相关资源
    最近更新 更多