2012-08-09 53 views
2

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

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

回答

5

阿伦斯”答案是好的方向,但有几点我想补充:

  • 如果你想从你的WebRole.cs访问ServerManager的你需要在evelated上下文中运行自己的角色为了被允许使用ServerManager。
<Runtime executionContext="elevated"/> 
  • 就像阿伦斯已经解释的,可以使用ServerManager的访问日志目录。此示例代码是多了几分 “天青友好”:

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 article看到,wad- IIS-failedreqlogfiles,wad- IIS的日志文件,并wad- 崩溃转储会自动考虑。这意味着如果您正确配置了DiagnosticMonitor,它会每隔X分钟将日志发送到存储帐户。如果您有多个服务器在运行(并且即使只有1个服务器),这也非常棒,因为您可以在中心位置访问所有日志。我最近使用CloudXplorer访问我的日志,因为它在浏览文件时为您提供类似于浏览器的体验。

注:对于我的言论3我假设你使用的是PaaS的WebRole(而不是IaaS的VM)。

+0

谢谢。这正是我所期待的。至于使用存储帐户,我们考虑过它,但最终因为几个客户原因/目标而决定采用这种帐户。这会让所有事情都变得更简单:) – kosh 2012-08-09 23:51:26

2

您可以使用类似于下面的东西拿到IIS7日志文件的位置:

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

它会以这种形式返回一个字符串: “的%SystemDrive%\的Inetpub \日志\ LogFiles文件”

+0

供参考:远程目标必须运行IIS'管理服务'。该服务必须启用并启动;否则你将无法查询这些信息。有关IIS远程管理服务的安装和配置的更多信息,请参见[this](http://www.iis.net/learn/manage/remote-administration/remote-administration-for-iis-manager)页面。 – codechurn 2014-07-06 19:35:48