首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >聊天日志管理,性能方面

聊天日志管理,性能方面
EN

Stack Overflow用户
提问于 2011-12-21 14:46:50
回答 4查看 722关注 0票数 0

我有一个应用程序从不同的来源接收消息(聊天室和私人聊天室)。可以打开应用程序的多个实例,最终结果应该类似于以下场景:

目前,每个应用程序都将日志保存在一个目录中,该目录的名称是用于登录聊天服务器的帐户;虽然私有聊天源(对于每个应用程序实例都是唯一的)没有问题,但是将相同的日志保存多次(涉及公共聊天室)是无用的。日志以纯文本格式保存,因此可以在不通过应用程序路由的情况下访问和读取日志。

如果我不将日志保存在单独的文件夹中,我可能会因为同时从多个进程访问同一个文件而获得I/O异常,并且需要验证即将保存的行是否已经被其他应用程序写入。我需要优化整个操作并努力维护代码的可读性。

此外,我目前的写作方法如下:

代码语言:javascript
复制
public void Write(string message)
    {
        using (var writer = new StreamWriter(_fileName, File.Exists(_fileName)))
            writer.WriteLine(message);
    }

考虑到日志是不断写入的,这可能不是最有效的解决方案。

总之,我的问题是:

  • 如何创建唯一的日志文件夹/数据库,维护其格式(纯文本),但解决上述重复/访问问题?
  • 如果可能的话,我如何改进写作方法?请记住,日志需要不断地编写,但是当应用程序退出时关闭StreamWriter并不是一个合适的解决方案,因为应用程序要运行很长时间。

谢谢。

EN

回答 4

Stack Overflow用户

发布于 2011-12-21 15:11:16

我会想出一个简单的解决方案,这可能适合您的需要,但不完全确定。

我的方法是为每个聊天会话/聊天室使用一个文件。如果启动了这样的会话,应用程序将尝试创建/打开该文件,并为该文件创建一个写锁。如果它获得一个IOException (因为文件被锁定),它可以完全跳过日志记录。

票数 1
EN

Stack Overflow用户

发布于 2011-12-21 14:57:58

老实说,如果我是您,我会考虑已经存在的开源框架,例如NLog。它足够快,并且支持异步日志记录,所以它应该做您想要的事情。

票数 0
EN

Stack Overflow用户

发布于 2011-12-21 15:05:19

不确定,我是否应该写这个作为回答或评论,但可能需要房间:

您提到了显示所需结果的草图,但正如我说过的,如果不对实例进行耦合,这将阻止您脱钩。以下是我的建议:

  • 您创建了两个应用程序: LogWriter,它是一个单例,位于草图的底部。
  • LogProcessor,它是草图中的应用程序实例。
  • 在启动LogProcessor实例时,如果它已经在运行,它会生成一个LogWriter或连接到它。
  • LogProcessor处理传入的日志请求,如果需要的话,可能会对它们进行预处理,然后将它们作为时间戳、ChatroomID、UserID (不一定是唯一的)、文本和散列的元组发送到LogWriter,以便更容易地脱扣。计算实例中的散列可以更好地利用多核。
  • LogWriter保持一个按时间戳排序的挂起列表,其中包含散列,因此它能够快速丢弃重复的项。
  • 对于其余的项,LogWriter确定日志文件路径。如果一个流已经打开到该路径,它会将项目写入,更新该流上的LastUsed时间戳并完成。
  • 如果没有打开流,则LogWriter打开一个流,然后写入。
  • 如果达到最大流数,则关闭最旧的流(如上面提到的LastUsed时间戳所示),然后打开所需的新流。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8591652

复制
相关文章

相似问题

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