我有一個Azure網站配置爲將IIS日誌寫入文件系統。我希望在我的網站中有一個儀表板頁面,管理員可以在該頁面上查看通過解析這些日誌生成的網站流量報告。從同一網站訪問Azure IIS日誌
我試圖通過DirectoryInfo.GetFiles()
訪問代碼中的日誌目錄,並嘗試使用FtpLib通過FTP進行連接。
從Azure外部,我可以連接到FTP並下載日誌,但是從在Azure網站中運行的代碼中,我無法使用。我假設Azure不允許從網站代碼出站FTP流量。
爲天青的文件夾結構(通過檢查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();
}
我能夠簡單地在LogFiles文件夾中的特定文件上使用File.ReadAllLines(...)並能夠讀取它。所以請檢查你的代碼。事實上,我可以做一個Directory.GetFiles()並獲取文件。所以請檢查你的代碼。或者發佈你的代碼進行進一步評估。 – ramiramilu
你確定你的路徑正確嗎? LogFiles通常存儲在C:以及根文件夾中。但是我看到D:在你的道路上。我非常肯定,您沒有對包含LogFiles和Site的根文件夾的寫入權限。路徑應該像C:\ DWASFiles \ Sites \ customname \ VirtualDirectory0 \ Site和C:\ DWASFiles \ Sites \ customname \ VirtualDirectory0 \ LogFiles – ramiramilu
是的,這些是Azure在異常中顯示的路徑。該網站作爲網站託管,而不是虛擬機或類似的東西。我沒有指定「D:」,這是Azure選擇的。正如問題中提到的,通過FTP進行查看意味着站點代碼位於/ site /中,並且日誌位於/ LogFiles /中。當然,這可能是文件實際外觀的抽象,因爲它是FTP,而不是直接訪問文件系統。 –