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