首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理异步日志写入的更好方法

处理异步日志写入的更好方法
EN

Stack Overflow用户
提问于 2012-10-23 14:09:47
回答 2查看 1.5K关注 0票数 2
代码语言:javascript
复制
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();
        }
    }
}

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-23 14:21:03

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

每个线程一个

  • 以避免锁定: no contention
  • Buffered以避免磁盘延迟

对应的是:

  • 是一种基于时间(毫秒)的合并工具,需要将应用程序活动作为一个整体来查看(vs thread activity)
  • buffering可能会在发生暴力终止

的情况下隐藏最后一条日志记录

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

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

临界区在共享内存中放置一个日志记录缓冲区,被观察的进程作为日志记录管理器进程,具有更高的优先级,它作为日志记录在触发器/触发器机制后面的消费者和生产者之间的通信:一个指针分配下的关键部分。

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

票数 3
EN

Stack Overflow用户

发布于 2012-10-23 14:28:08

在每次日志请求时打开、写入和关闭文件都是多余且低效的。

在日志类上,使用一个缓冲区,并将该缓冲区的内容写入文件,可以是每X个请求、关闭一次,也可以是每Y分钟一次。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13024433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档