从同一网站访问Azure IIS日志

时间:2014-01-06 13:47:22

标签: azure iis logging ftp azure-web-sites

我有一个Azure网站,配置为将IIS日志写入文件系统。我希望在我的网站中有一个仪表板页面,管理员可以在其中查看有关站点流量的报告,该报告是通过解析这些日志生成的。

我试图通过DirectoryInfo.GetFiles()访问代码中的日志目录,并尝试使用FtpLib通过FTP进行连接。

从Azure外部,我可以连接到FTP并下载日志,但是从Azure网站中运行的代码,我无法。我假设Azure不允许来自网站代码的出站FTP流量。

Azure的文件夹结构(通过检查FTP)看起来像:

网站:/site/wwwroot

日志:/LogFiles/http/RawLogs

在Azure门户中,您可以创建虚拟目录,但只允许在/ site中使用。

网站作为Azure网站,MVC 4,集成管道,64位,.NET 4.5运行,而对于FTP,我使用的是FtpLib v1.0.1.2。 FtpLib在Login()失败并显示消息:未知错误(0x2ee2)

我知道我可以更改Azure中的日志记录以记录到Blob存储,但这会导致额外的每月费用。是否有其他选项可以访问这些文件?

感谢。

编辑:已被要求提供代码,这里是FTP版本(在本地工作,而不是在Azure上工作):

using (var ftp = new FtpConnection("XXXXXXXX.windows.net", "XXXXXXXX", "XXXXXXXX"))
{
    ftp.Open();
    ftp.Login(); //Fails here
    ftp.SetLocalDirectory(Server.MapPath("~/")); //Temp
    ftp.SetCurrentDirectory("/LogFiles/http/RawLogs");                

    foreach (var f in ftp.GetFiles("*.log"))
    {
        ftp.GetFile(f.Name, f.Name, false);
        ftp.RemoveFile(f.Name);
    }              
}

这是文件系统版本:

//var logRoot = Server.MapPath("~/../../LogFiles/http/RawLogs"); //Throws error about traversal outside of site root
//var logRoot = "/LogFiles/http/RawLogs"; //Throws error: Could not find a part of the path 'D:\LogFiles\http\RawLogs'. 
var logRoot = "LogFiles/http/RawLogs"; //Throws error: Could not find a part of the path 'D:\Windows\system32\LogFiles\http\RawLogs'. 
foreach (var f in new DirectoryInfo(logRoot).GetFiles("*.log"))
{
    f.CopyTo(root + f.Name, true);
    f.Delete();
}

1 个答案:

答案 0 :(得分:1)

我看到了日志文件路径的问题。 AzureWebsites使用C Drive,但在您的实现中,您将获得D Drive。使用Server.MapPath("~")然后在其上进行字符串操作以获得正确的ROOT路径。所以根目录将有另外两个目录 - LogFilesSite。当您已经获得Root目录时,将其附加到LogFiles目录并从那里读取所有文件。