Логгер

  • Автор темы Coder
  • Дата начала
C

Coder

Гость
#1
Здравствуйте, программисты!

Есть класс, отвечающий за логирование. Он записывает данные в текстовой файл:

class TxtLogger : ILogger
{
protected FileStream f1;
protected string FileName = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + "\\Folder\\Output1.txt";
protected string CurrentLogText;
protected StreamWriter output;
protected Queue lgrMsg = new Queue();

public void Log(string message, MessageType messageType)
{
CurrentLogText = "Message text: " + message + ", " + DateTime.Now.ToString() + ", Type: " + messageType;
lgrMsg.Enqueue(CurrentLogText);

f1 = new FileStream(FileName, FileMode.Append);
output = new StreamWriter(f1);


while (lgrMsg.Count > 0)
{
output.WriteLine(lgrMsg.Dequeue());
}
output.Close();
f1.Close();
}
}

Если метод этого класса вызывается в одном потоке (много раз), всё работает хорошо. Но как только я пытаюсь вызвать его из двух потоков одновременно, выскакивает ошибка (exeption), которая говорит, что текстовой файл используется другим процессом.
Я понимаю, что нельзя одновременно записывать в один файл из двух потоков, поэтому организовал очередь (Queue). Но проблема не решилась.

Прошу помочь, а то уже долго мучаюсь. Спасибо!
 
D

DZX

Гость
#2
Сделать Singleton и доступ к нему между потоками через lock распределять ... и файл держать открытым и дописывать в него походу...
 

LuMee

Well-Known Member
02.05.2006
477
0
#3
Если требуется просто писать в лог, можно воспользоваться стандартным классом System.Diagnostics.Trace, его можно заставить писать и в файл. Еще можно взять стороннюю библиотеку типа log4net.