Ваша проблема в вашем Error
методе: он берет блокировку, но не снимает ее снова.
Кроме того, вы действительно должны использовать try/finally
при взятии блокировки. Это гарантирует, что, если исключение выдается при записи сообщения журнала, блокировка всегда снимается:
public static string Error(string log)
{
StringBuilder sb = new StringBuilder();
string logMessage = DateTime.Now.ToString() + " | ERROR | " + log;
writeLock.EnterWriteLock();
try
{
using (StreamWriter writetext = File.AppendText(filePath))
{
writetext.WriteLine(logMessage);
Console.WriteLine(logMessage);
}
}
finally
{
writeLock.ExitWriteLock();
}
return logMessage;
}
При этом блокировка чтения / записи является специализированной блокировкой, которая позволяет одному записывающему устройству или нескольким читателям получить доступ к ресурсу одновременно. У вас нет читателей, поэтому нет смысла использовать блокировку чтения / записи. Просто используйте обычный замок:
public class Logger
{
const string filePath = "Log.txt";
private static readonly object lockObject = new object();
public static string Info(string log)
{
StringBuilder sb = new StringBuilder();
string logMessage = DateTime.Now.ToString() + " | INFO | " + log;
lock (lockObject)
{
using (StreamWriter writetext = File.AppendText(filePath))
{
writetext.WriteLine(logMessage);
Console.WriteLine(logMessage);
}
}
return logMessage;
}
public static string Error(string log)
{
StringBuilder sb = new StringBuilder();
string logMessage = DateTime.Now.ToString() + " | ERROR | " + log;
lock (lockObject)
{
using (StreamWriter writetext = File.AppendText(filePath))
{
writetext.WriteLine(logMessage);
Console.WriteLine(logMessage);
}
}
return logMessage;
}
}