2012-06-13 2 views
1

Я использую StreamWriter для записи файла журнала.Asp.net MVC3 C#, ошибка StreamWriter

И это метод написания журнала,

public void Write(string fileNamePrefix, string msg){ 
    GenerateFileName(fileNamePrefix); 

    string logTime = "> "+DateTime.Now.ToShortDateString().ToString() + " " + DateTime.Now.ToLongTimeString().ToString()+"\r\n"; 

    using (StreamWriter sw = new StreamWriter(fileName, true)) 
    { 
    sw.WriteLine(logTime + msg); 
    sw.Flush(); 
    sw.Close(); 
    sw.Dispose(); 
    } 
} 

При использовании этого метода для записи журнала, я получил сообщение об ошибке, что сказать " Процесс не может получить доступ к файлу«C: \ Users \ знак \ documents \ visual studio 2010 \ Projects \ eee \ eee.WebUI \ log \ Order_20120613 ', потому что он используется другим процессом. "

Не все время появляется сообщение об ошибке, когда я запускаю много процессов на то же время и процессы используют этот метод для записи журнала, затем я получаю это сообщение об ошибке.

Кто-нибудь знает, что я делаю неправильно? как избежать этой ошибки?

и это правильный путь для записи журнала? Как вы обычно записываете журнал процессов?

спасибо.

+0

Откуда взялось fileName? Предполагается, что это 'var fileName = GenerateFileName (fileNamePrefix);'? – alexn

+0

yes right, GenerateFileName() метод сгенерировать имя файла, например, Order_20120613 –

+0

На какой строке метода вы получаете сообщение об ошибке? В ('new StreamWriter (filename)'? – hometoast

ответ

3

Ошибки ввода-вывода ожидаемое поведение для классов, связанных с I/O. Поэтому приготовьтесь к их обработке.

В вашем конкретном случае это скорее всего вызвано конфликтами имен файлов - убедитесь, что имена для файлов журнала являются уникальными между процессами и потоками в каждом процессе.

несвязанные комментарии:

  • Там нет абсолютно никакой необходимости вызывать sw.Flush();sw.Close(); sw.Dispose();, если вы используете using (так как он уже правильно называет sw.Dispose() включая случаи исключения). Даже если вы не сделаете этого, вызов как Close, так и Dispose не имеет значения, поскольку оба вызывали один и тот же код.

  • Изобретение (обычно называемое «изобретать колесо») Библиотеки записи и отслеживания журналов являются традиционными для разработчиков временем. Если вы не считаете, что это упражнение или развлечение, используйте существующие библиотеки, подобные тем, которые уже являются частью .Net framework (который позволяет настраивать несколько прослушивателей трассировки и т. Д.) Или других, таких как Log4Net.

+0

Если вы не используете несколько файлов, вам нужно либо вручную использовать блокировку файла, либо использовать предложение Tim о log4net (или я предпочитаю NLog) – hometoast

+0

Спасибо! Я попытаюсь использовать log4net, Надеюсь, что это не сложно использовать.: P –

+0

@Expertwannabe Я действительно рекомендую использовать NLog вместо Log4Net. Log4Net - это немного сложный для настройки и использования. – alexn

2

Вы должны изучить log4net. Thread-safe (проблема, с которой вы столкнулись, несколько потоков/процессов, пытающихся использовать один и тот же файл) и очень гибкий.

+0

Большое спасибо! –

+0

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