2010-09-29 105 views
1

我有一個類庫,部署在ISP服務器上供ASP.NET Web服務使用。我想跟蹤任何錯誤,在這種情況下,我無法訪問Windows事件日誌。所以我想我會使用StreamWriter類寫入一個txt文件。問題是如果我不給絕對路徑,而只是試圖寫入C:\ Windows \ System32的文件名,那對我來說就沒有好處。 如何告訴它可能使用數據目錄或應用程序根目錄?有什麼想法嗎?C#類庫:StreamWriter寫入system32文件夾

回答

2

這裏是我以前用的,這是一個有點笨拙,但它能夠完成任務:

using System; 
using System.Collections.Generic; 
using System.Web.UI; 

public static class Logger 
{ 
private static readonly Page Pge = new Page(); 
     private static readonly string Path = Pge.Server.MapPath("~/yourLogPath/Log.txt"); 
     private const string LineBreaker = "\r\n\r======================================================================================= \r\n\r"; 

public static void LogError(string myMessage, Exception e) 
{ 
    const LogSeverity severity = LogSeverity.Error; 
    string messageToWrite = string.Format("{0} {1}: {2} \r\n\r {3}\r\n\r {4}{5}", DateTime.Now, severity, myMessage, e.Message, e.StackTrace, LineBreaker); 
    System.IO.File.AppendAllText(Path, messageToWrite); 
} 
} 

我有這個類在它自己的項目,從網站本身分開,和我用它在我的所有其他非網站項目......

編輯: 順便說一句LogSeverity只是一個枚舉我編了......

+0

是的,只要你添加一個引用System.Web程序集 – 2010-09-29 20:30:47

+0

就像我說的,有點笨重,但它完成工作。 :)也許我說了很多笨蛋...... – EJC 2010-09-29 20:42:28

0

嘗試檢查出來:

Application.StartupPath; 

這裏有一個link to the docs

獲取可執行文件 啓動應用程序,而不是 包括可執行文件名的路徑。

string path = Application.StartupPath; 

注意:您仍然需要添加一個文件名。

+0

我不能從一個類庫訪問System.Windows.Forms.Application.StartupPath應用程序,我可以嗎? – 2010-09-29 19:44:37

+0

是的,右鍵單擊引用並導入System.Windows.Forms – 2010-09-29 20:27:10

0

你可以這樣做找出你的可執行文件的路徑:

string path = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); 
+0

當我嘗試在我的本地託管解決方案時,我在\ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ASP.NET Files \ ..中獲得了一個路徑真的不是我所追求的。 – 2010-09-29 19:40:18

+0

啊我的不好,這不適用於ASP.NET web服務。使用Server.MapPath方法。儘管如此,您仍然需要對目標文件夾的寫入權限。 – BrokenGlass 2010-09-29 19:49:01

1

在我的網絡產品,在web.config我指定的appSettings塊這樣的:

<configuration> 
    <appSettings> 
     <add key="MyLogPath" value="LogPath" /> 
    </appSettings> 
</configuration> 

這你可以使用從代碼如

ConfigurationManager.AppSettings["MyLogPath"] 

然後你可以讓安裝程序配置它,無論你在哪裏想。您可能不希望日誌文件在您的應用程序目錄中。

+0

是的,但我需要類庫DLL來登錄,而不是網絡產品。 – 2010-09-29 19:41:31

+0

你也可以在你的類庫項目中添加一個app.config來實現這個 – EJC 2010-09-29 20:09:24

+0

我仍然可以使用相對於應用程序的路徑嗎?我真的不想使用安裝程序,只需複製/發佈到ISP給我的虛擬目錄即可。 – 2010-09-29 20:14:48

3

使用Server.MapPath獲取相對於Web應用程序的路徑。

using (FileStream fs = new FileStream(Server.MapPath("~/logs/logfile.txt"), 
             FileMode.Append)) { 
    //do logging here. 
} 

雖然以前的一些海報都使用反射來得到執行大會的建議,我不知道是否這將加快您的Web應用程序或w3wp進程。如果是後者,您仍然會嘗試寫入System32文件夾。

+0

Server.MapPath也應該在Class Library中起作用 – EJC 2010-09-29 20:10:37

+0

您的完美意義,我將在此處發佈我的代碼以用於使用Server.MapPath的日誌記錄類...我使用它來登錄我的類庫以及網站。如果我能找到代碼,我最近切換到使用ELMAH和Log4Net ... – EJC 2010-09-29 20:15:19

+0

http://stackoverflow.com/questions/1199486/server-mappath-in-c-classlibrary – 2010-09-29 20:23:46

相關問題