gpt4 book ai didi

c# - 处理异步日志写入的更好方法

转载 作者:行者123 更新时间:2023-11-30 22:24:01 34 4
gpt4 key购买 nike

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();
}
}
}

我有一个写日志的类。因为我正在异步写入日志,所以我需要锁定并在写入完成后释放它,但这似乎是一个笨拙的解决方案,甚至可能对性能不利。

有什么更好的方法来处理这个问题?

最佳答案

出于性能原因,同时为了避免在登录和注销之间出现截然不同的行为,我建议每个线程运行一个缓冲日志文件。

  • 每个线程一个以避免锁定:无争用
  • 缓冲以避免磁盘延迟

对应的是:

  • 需要一个基于时间(毫秒)的合并工具来查看整个应用程序事件(相对于线程事件)
  • 缓冲可能会隐藏最后的日志记录以防意外终止

要更进一步实时,您必须登录内存,并开发一个专用接口(interface)来提取请求日志,但这种日志通常保留给硬实时嵌入式应用程序。

低 CPU 消耗的安全日志记录的其他解决方案(低级 C 编程):

  • 将日志记录缓冲区放入共享内存
  • 观察到的进程充当日志记录生产者
  • 创建一个日志管理进程,具有更高的优先级,作为日志记录消费者
  • 在 flip/flop 机制背后管理消费者和生产者之间的通信:临界区下的指针分配。

如果观察到的进程崩溃,则不会丢失任何日志记录,因为共享内存段附加到日志管理器进程。

关于c# - 处理异步日志写入的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13024433/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com