2014-01-06 81 views
0

我有一個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(); 
} 
+0

我能夠簡單地在LogFiles文件夾中的特定文件上使用File.ReadAllLines(...)並能夠讀取它。所以請檢查你的代碼。事實上,我可以做一個Directory.GetFiles()並獲取文件。所以請檢查你的代碼。或者發佈你的代碼進行進一步評估。 – ramiramilu

+0

你確定你的路徑正確嗎? LogFiles通常存儲在C:以及根文件夾中。但是我看到D:在你的道路上。我非常肯定,您沒有對包含LogFiles和Site的根文件夾的寫入權限。路徑應該像C:\ DWASFiles \ Sites \ customname \ VirtualDirectory0 \ Site和C:\ DWASFiles \ Sites \ customname \ VirtualDirectory0 \ LogFiles – ramiramilu

+0

是的,這些是Azure在異常中顯示的路徑。該網站作爲網站託管,而不是虛擬機或類似的東西。我沒有指定「D:」,這是Azure選擇的。正如問題中提到的,通過FTP進行查看意味着站點代碼位於/ site /中,並且日誌位於/ LogFiles /中。當然,這可能是文件實際外觀的抽象,因爲它是FTP,而不是直接訪問文件系統。 –

回答

1

我查看有關日誌文件路徑的問題。 AzureWebsites使用C Drive,但在您的實施中,您將獲得D Drive。使用Server.MapPath("~"),然後在其上執行字符串操作以獲得正確的ROOT路徑。所以根目錄將有兩個更多的目錄 - LogFilesSite。由於您已經擁有根目錄,請將其追加到LogFiles目錄並從此處讀取所有文件。

+0

謝謝。我在本地訪問它的問題是由於我以錯誤的方式映射到文件系統。寫入時的正確路徑是:Server.MapPath(「〜/」)+ @「.. \ .. \ LogFiles \ http \ RawLogs」。通過FTP訪問似乎被阻止,所以我放棄了那條大道。 –