2010-09-29 3 views
1

У меня есть библиотека классов, которая развернута на сервере ISP для использования веб-службой ASP.NET. Я бы хотел отслеживать любые ошибки, и в этом случае журнал событий Windows недоступен для меня. Поэтому я думал, что напишу в txt-файл, используя класс StreamWriter. Проблема в том, что если я не даю абсолютный путь и просто имя файла, которое он пытается записать в 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); 
} 
} 

Я имел этот класс в своем собственном проекте, отдельно от самого сайта, и я использовал его в все мои другие не веб-проектов ...

Edit: Btw LogSeverity это просто перечисление я сделал ...

+0

Да, это работает, пока вы добавляете ссылку на сборку System.Web –

+0

, как я уже сказал, немного неуклюжий, но это выполняет свою работу. :) Может, я сказал много неуклюже ... – EJC

0

Попробуйте проверить:

Application.StartupPath; 

Вот link to the docs

Получает путь к исполняемому файлу , который начал приложение, не включая имя исполняемого файла.

string path = Application.StartupPath; 

Примечание: вы по-прежнему необходимо добавить имя файла.

+0

Я не могу получить доступ к System.Windows.Forms.Application.StartupPath из библиотеки классов приложение, может я? –

+0

Да, щелкните правой кнопкой мыши ссылки и импортируйте System.Windows.Forms –

0

Вы можете узнать путь исполняемого файла, делая это:

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

, когда я попробую, чтобы на моем локально размещенном решении я получил путь где-то внутри \ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ASP.NET Files \ .. который на самом деле это не то, что мне нужно. –

+0

ah my bad, это не относится к веб-службам ASP.NET. Перейдите с помощью подхода Server.MapPath. Однако вам все равно понадобятся права на запись в целевую папку. – BrokenGlass

1

В моем веб-продукта, в web.config я укажу AppSettings блок, как это:

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

который вы можете использовать код, например

ConfigurationManager.AppSettings["MyLogPath"] 

, то вы можете установить установщик таким образом, хотеть. вам, вероятно, не нужны файлы журналов в вашем каталоге приложений.

+0

Да, но мне нужна DLL библиотеки классов для регистрации, а не для веб-продукта. –

+0

, вы также можете добавить app.config в свой проект библиотеки классов, чтобы достичь этого. – EJC

+0

Не могли бы я использовать путь по отношению к приложению? И я действительно не могу использовать установщик, просто скопируйте/опубликуйте в виртуальный каталог, предоставленный мне провайдером. –

3

Используйте Server.MapPath, чтобы получить путь относительно веб-приложения.

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

В то время как некоторые из предыдущих плакатов предложили использовать отражение, чтобы получить выполняющую сборку, я не уверен, является ли или нет, что будет чистый вам веб-приложение или процесс w3wp. Если это последний, вы все равно попытаетесь написать папку System32.

+0

Server.MapPath тоже должен работать в библиотеке классов – EJC

+0

, что я имею в виду, я отправлю свой код здесь для моего журнала, использующего Server.MapPath ... Я использую его для входа в мои библиотеки классов, а также на веб-сайт , Если я смогу найти код, я недавно переключился на использование ELMAH и Log4Net ... – EJC

+0

http://stackoverflow.com/questions/1199486/server-mappath-in-c-classlibrary –

 Смежные вопросы

  • Нет связанных вопросов^_^