1

我有一个部署在 ISP 服务器上的类库,供 ASP.NET Web 服务使用。我想跟踪任何错误,在这种情况下,我无法访问 Windows 事件日志。所以我想我会使用 StreamWriter 类写入一个 txt 文件。问题是如果我没有给出绝对路径而只是一个文件名,它会尝试写入 C:\Windows\System32,这对我没有好处。我如何告诉它使用数据目录或应用程序根目录?有什么想法吗?

4

5 回答 5

3

用于Server.MapPath获取相对于 Web 应用程序的路径。

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

虽然之前的一些海报建议使用反射来获取执行程序集,但我不确定这是否会为您提供 Web 应用程序或 w3wp 进程。如果是后者,您最终仍会尝试写入 System32 文件夹。

于 2010-09-29T19:34:33.620 回答
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 只是我编造的一个枚举......

于 2010-09-29T20:24:06.493 回答
1

在我的网络产品中,在 web.config 中,我指定了一个 appSettings 块,如下所示:

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

您可以从代码中使用它

ConfigurationManager.AppSettings["MyLogPath"]

然后您可以让安装程序将其配置到您想要的任何位置。您可能不希望应用程序目录中的日志文件。

于 2010-09-29T19:27:20.130 回答
0

您可以通过执行以下操作找出可执行文件的路径:

string path = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
于 2010-09-29T19:23:46.733 回答
0

尝试检查:

Application.StartupPath;

这是文档的链接

获取启动应用程序的可执行文件的路径,不包括可执行文件名。

string path = Application.StartupPath;

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

于 2010-09-29T19:22:12.747 回答