聊天日志管理,性能方面

时间:2011-12-21 14:46:50

标签: c# performance chat logging streamwriter

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

Desired data flow

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

如果我不将日志保存在单独的文件夹中,由于从多个进程同时访问同一文件,我可能会得到I / O异常,并且我需要验证要保存的行是否没有已经由其他应用程序编写。我需要优化整个操作并尝试维护代码可读性。

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

public void Write(string message)
    {
        using (var writer = new StreamWriter(_fileName, File.Exists(_fileName)))
            writer.WriteLine(message);
    }

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

总结一下,我的问题是:

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

谢谢。

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

老实说,如果我是你,我会考虑已经存在的开源框架,例如: NLog。它足够快并支持异步日志记录,因此它应该完全符合您的要求。

答案 2 :(得分:0)

不确定,如果我应该把它写成答案或评论,但可能需要房间:

你提到你的草图显示了所需的结果,但正如我所说,如果你不结合实例,这将阻止你进行重复数据删除。所以这就是我的建议:

  • 您创建了两个应用程序:LogWriter,它是一个单例并位于草图的底部
  • LogProcessor,它是草图中的应用程序实例。
  • 启动LogProcessor实例后,它会生成一个LogWriter或连接到它,如果它已在运行。
  • LogProcessor处理传入的日志请求,如果需要,可以对它们进行预处理,然后将它们作为Timestamp,ChatroomID,UserID(不一定是唯一的),文本和可能的哈希的元组发送到LogWriter。更容易推卸。计算实例中的散列可以更好地利用多个核心
  • LogWriter保留一个按时间戳排序的挂起列表,其中包含哈希值,因此可以快速丢弃重复的项目
  • 对于其余项目,LogWriter确定日志文件路径。如果流已经对该路径开放,它会将该项目写出,更新该流上的LastUsed时间戳并完成
  • 如果没有打开流,LogWriter会打开一个,然后写入。
  • 如果达到最大流数,它将关闭最旧的流(如上面提到的LastUsed Timestamp)并打开所需的新流。

答案 3 :(得分:0)

或许更改您的应用程序设计,使记录器连接到聊天室而不是用户。

当用户进入聊天室时,聊天室会将记录器对象传递给用户。

这样所有用户都将使用相同的记录器。然后问题变成:1个消费者(记录器)和多个生产者(所有那些想要记录的用户)。

请参阅此帖子的my reply

  

Write to FileOutputStream from multiple threads in Java

这里

  

https://stackoverflow.com/a/8422621/1007845

相关问题