2010-09-29 113 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

相关问题