登录多线程环境并进行测试

时间:2011-04-01 18:45:08

标签: c# c++ testing logging

请在下面的方案中告诉我有关如何设计日志记录以及如何测试日志的建议。

我有一个可由多个线程调用的API。单个线程对此API的一次调用会生成50 KB的日志。

是否存在用于在多线程环境中登录的任何设计模式。即所有线程的一个日志文件与每个线程的一个专用日志文件

并且,如何测试此功能。 (应该测试吗?)

感谢。

8 个答案:

答案 0 :(得分:1)

如果您正在讨论事务活动的日志记录,其中50 KB日志中的所有数据都与线程执行的特定事务相关,则每个线程可能存在一个日志,否则会解开输出可能成为一个重大问题。针对此特定情况的另一个解决方案实际上可能是每个事务的单个日志文件,其中“全局”日志仅在一行上提及事务已启动,并且可能是最终结果的另一个条目(如果适用)。第三种解决方案是确保以这样的方式标记日志条目,即您可以确定与每条线相关联的事务,然后使用可以过滤日志以查看特定事务的后处理工具。

如果您有非常频繁的事务,第二个解决方案(每个事务的文件)可能会成为一个问题,因为一些文件系统操作(特别是通过网络检查文件夹)随着目录中文件数量的增加而变慢。第三种解决方案可以很好地工作(因为您可以为过滤/查看工具添加其他功能),但它确实意味着开发和维护另一个工具。

答案 1 :(得分:0)

您可能应该在创建记录器对象实例时使用双重锁定将记录器实例包装到Singleton中,以保护它免受初始化时的竞争条件的影响。

答案 2 :(得分:0)

这取决于您的应用程序的需求。如果您希望能够轻松查看所有线程中发生事件的顺序,那么您可能希望使用单个日志文件并在线程之间同步对它的访问。如果每个线程或多或少地独立运行,并且您只关心一次在单个线程中发生的事情,那么每个线程使用一个单独的日志文件。

答案 3 :(得分:0)

将您的日志记录实例包装在一个线程安全的单例中。 Don't use double check locking!此外,使用log4netEnterprise Library 5等记录库可能是有意义的。

答案 4 :(得分:0)

我在过去创建了Loggers,我们是线程本地的。只有当从多个线程写入相同的FileSink时,才会有可配置数量的LogSinks锁定进入视图。

通过创建Loggers线程本地,实现堆栈跟踪相当容易(在C / C ++代码库中)。

答案 5 :(得分:0)

我不确定这是否是最好的方法,我在我的代码中使用了类似的东西

void Log( const char* msg ) {
#ifdef ENABLE_LOGGING
    boost::mutex::scoped_lock lock(m_mutex); 

    // do a fprintf or what you want
#endif
}

当您从多个线程调用时,互斥锁确保此函数一次只能执行一个。

答案 6 :(得分:0)

对于高性能日志记录,请查看Microsoft Message Queue(MSMQ)。

每个线程都可以写入同一个消息队列,而单独的服务/进程可以从队列中读取并以日志存储格式存储数据。这可以避免线程之间的任何争用并最大化性能。

答案 7 :(得分:0)

您可以使用内存队列(它们是.NET 4中的新队列.Collections.Concurrent是线程安全的。 然后让一个工作线程读取队列并登录到文件/ db。