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