3

我们有一堆在 Azure(和 IIS 7.5)上运行的服务器。我试图编写一个独立的应用程序,它会定期将来自服务器的日志文件聚合到一个中心位置。通过聚合,它实际上是将我们的自定义上传器指向目录并让它完成它的事情。

有没有一种简单的方法可以(以编程方式)获取为我的站点配置的 logdir 的位置?

4

2 回答 2

5

AaronS 的回答是朝着好的方向,但我想补充几点:

  • 如果你想从你的 WebRole.cs 访问 ServerManager,你需要在升级的上下文中运行你的角色才能被允许使用 ServerManager。
<Runtime executionContext="elevated"/>
  • 就像 AaronS 已经解释的那样,您可以使用 ServerManager 访问日志目录。此示例代码更“对 Azure 友好”:

using (ServerManager serverManager = new ServerManager())
{
    var siteName = RoleEnvironment.CurrentRoleInstance.Id + "_Web";
    var id = serverManager.Sites[siteName].Id;
    var logFile = serverManager.Sites[siteName].LogFile;

    var iisLogDirectory = String.Format("{0}\\W3SVC{1}", logFile.Directory, id);
}

  • 为什么不简单地使用 Windows Azure 诊断程序?从MSDN 文章中可以看出,wad -iis-failedreqlogfiles、wad -iis-logfiles和 wad -crash-dump被自动考虑在内。这意味着如果您正确配置了 DiagnosticMonitor,它将每 X 分钟将您的日志发送到存储帐户。如果您有多个服务器正在运行(即使您只有 1 个),这非常棒,因为您可以在一个中心位置访问所有日志。我最近使用 CloudXplorer 访问我的日志,因为它在浏览文件时为您提供了类似资源管理器的体验。

注意:对于我的 3 条评论,我假设您使用的是 PaaS WebRole(而不是 IaaS VM)。

于 2012-08-09T21:35:12.250 回答
2

您可以使用类似于以下内容的方式获取 IIS7 日志文件位置:

using (ServerManager manager = ServerManager.OpenRemote("yourservername"))
{
     Site defaultSite = manager.Sites[0];
     string loglocation=defaultSite.LogFile.Directory;
}

它将以这种格式返回一个字符串:“%SystemDrive%\inetpub\logs\LogFiles”

于 2012-08-09T21:02:09.500 回答