У меня есть библиотека классов, которая развернута на сервере ISP для использования веб-службой ASP.NET. Я бы хотел отслеживать любые ошибки, и в этом случае журнал событий Windows недоступен для меня. Поэтому я думал, что напишу в txt-файл, используя класс StreamWriter. Проблема в том, что если я не даю абсолютный путь и просто имя файла, которое он пытается записать в C: \ Windows \ System32, и это не хорошо для меня. Как я могу сказать, чтобы использовать, возможно, каталог данных или корень приложения? Есть предположения?Библиотека классов C#: запись StreamWriter в папку system32
ответ
Вот что я имел обыкновение использовать, это немного неуклюжее, но он получает работу:
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);
}
}
Я имел этот класс в своем собственном проекте, отдельно от самого сайта, и я использовал его в все мои другие не веб-проектов ...
Edit: Btw LogSeverity это просто перечисление я сделал ...
Попробуйте проверить:
Application.StartupPath;
Вот link to the docs
Получает путь к исполняемому файлу , который начал приложение, не включая имя исполняемого файла.
string path = Application.StartupPath;
Примечание: вы по-прежнему необходимо добавить имя файла.
Я не могу получить доступ к System.Windows.Forms.Application.StartupPath из библиотеки классов приложение, может я? –
Да, щелкните правой кнопкой мыши ссылки и импортируйте System.Windows.Forms –
Вы можете узнать путь исполняемого файла, делая это:
string path = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
, когда я попробую, чтобы на моем локально размещенном решении я получил путь где-то внутри \ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ASP.NET Files \ .. который на самом деле это не то, что мне нужно. –
ah my bad, это не относится к веб-службам ASP.NET. Перейдите с помощью подхода Server.MapPath. Однако вам все равно понадобятся права на запись в целевую папку. – BrokenGlass
В моем веб-продукта, в web.config я укажу AppSettings блок, как это:
<configuration>
<appSettings>
<add key="MyLogPath" value="LogPath" />
</appSettings>
</configuration>
который вы можете использовать код, например
ConfigurationManager.AppSettings["MyLogPath"]
, то вы можете установить установщик таким образом, хотеть. вам, вероятно, не нужны файлы журналов в вашем каталоге приложений.
Да, но мне нужна DLL библиотеки классов для регистрации, а не для веб-продукта. –
, вы также можете добавить app.config в свой проект библиотеки классов, чтобы достичь этого. – EJC
Не могли бы я использовать путь по отношению к приложению? И я действительно не могу использовать установщик, просто скопируйте/опубликуйте в виртуальный каталог, предоставленный мне провайдером. –
Используйте Server.MapPath
, чтобы получить путь относительно веб-приложения.
using (FileStream fs = new FileStream(Server.MapPath("~/logs/logfile.txt"),
FileMode.Append)) {
//do logging here.
}
В то время как некоторые из предыдущих плакатов предложили использовать отражение, чтобы получить выполняющую сборку, я не уверен, является ли или нет, что будет чистый вам веб-приложение или процесс w3wp. Если это последний, вы все равно попытаетесь написать папку System32.
Server.MapPath тоже должен работать в библиотеке классов – EJC
, что я имею в виду, я отправлю свой код здесь для моего журнала, использующего Server.MapPath ... Я использую его для входа в мои библиотеки классов, а также на веб-сайт , Если я смогу найти код, я недавно переключился на использование ELMAH и Log4Net ... – EJC
http://stackoverflow.com/questions/1199486/server-mappath-in-c-classlibrary –
Да, это работает, пока вы добавляете ссылку на сборку System.Web –
, как я уже сказал, немного неуклюжий, но это выполняет свою работу. :) Может, я сказал много неуклюже ... – EJC