C# 处理异步日志写入的更好方法
我有一个写日志的类。因为我是异步写入日志的,所以我需要在写入完成时锁定并释放它,但这似乎是一个笨拙的解决方案,甚至可能对性能有害C# 处理异步日志写入的更好方法,c#,.net,multithreading,file-io,C#,.net,Multithreading,File Io,我有一个写日志的类。因为我是异步写入日志的,所以我需要在写入完成时锁定并释放它,但这似乎是一个笨拙的解决方案,甚至可能对性能有害 处理此问题的更好方法是什么?出于性能原因,同时为了避免登录和注销之间出现非常不同的行为,我建议每个线程运行一个缓冲日志文件 每个线程一个以避免锁定:无争用 缓冲以避免磁盘延迟 副本如下: 需要基于时间(毫秒)的合并工具来查看整个应用程序活动(相对于线程活动) 缓冲可能会在野蛮终止的情况下隐藏最后的日志记录 要进一步实现实时,您必须登录内存,并开发一个专用接口来
处理此问题的更好方法是什么?出于性能原因,同时为了避免登录和注销之间出现非常不同的行为,我建议每个线程运行一个缓冲日志文件
- 每个线程一个以避免锁定:无争用
- 缓冲以避免磁盘延迟
- 需要基于时间(毫秒)的合并工具来查看整个应用程序活动(相对于线程活动)
- 缓冲可能会在野蛮终止的情况下隐藏最后的日志记录
- 将日志记录缓冲区放入共享内存
- 观察到的过程充当日志记录生成器
- 创建具有更高优先级的日志管理器进程,该进程充当日志记录使用者
- 在触发器机制下管理消费者和生产者之间的通信:关键部分下的指针分配
如果观察到的进程崩溃,则不会丢失任何日志记录,因为共享内存段已附加到日志管理器进程。在每个日志请求上打开、写入然后关闭文件既冗余又低效
在日志类上,使用缓冲区,并将该缓冲区的内容写入文件,可以是每X请求一次、关机一次,也可以是每Y分钟一次。是否有理由不使用现有的日志库,如
NLog
或log4Net
?谢谢。我最初把缓冲区排除在外,因为我害怕不去捕捉每一个错误,但是随着计算量的增加,我会再次考虑这个选项。
public static class LogWriter
{
private static ReaderWriterLockSlim writeLock = new ReaderWriterLockSlim();
public static void WriteExceptionLog(string content)
{
#if DEBUG
MessageBox.Show(content);
#endif
WriteLog(content, Constant.EXCEPTION_LOG_PATH);
}
public static void WriteLog(string content, string path)
{
try
{
writeLock.EnterWriteLock();
string directory = Path.GetDirectoryName(path);
if (!Directory.Exists(Path.GetDirectoryName(directory)))
Directory.CreateDirectory(directory);
using (StreamWriter writeFile = new StreamWriter(path, true))
{
content = DateTime.Now + " : " + content;
writeFile.WriteLine(content);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
writeLock.ExitWriteLock();
}
}
}