请告诉我您对以下情况中如何设计和测试日志记录的建议。
我有一个API,可以被多个线程调用。单个线程调用此API会生成50 KB的日志。
在多线程环境下,是否存在适用于日志记录的设计模式,即所有线程的一个日志文件 vs 每个线程的一个专用日志文件?
而且,如何测试这个功能(是否应该测试?)。
谢谢。
请告诉我您对以下情况中如何设计和测试日志记录的建议。
我有一个API,可以被多个线程调用。单个线程调用此API会生成50 KB的日志。
在多线程环境下,是否存在适用于日志记录的设计模式,即所有线程的一个日志文件 vs 每个线程的一个专用日志文件?
而且,如何测试这个功能(是否应该测试?)。
谢谢。
如果您正在谈论事务活动的日志记录,其中50 KB日志中的所有数据都与线程执行的特定事务相关,则可能需要为每个线程创建一个日志,否则解开输出可能会成为一个重大问题。对于这种特殊情况,另一种解决方案实际上可能是每个事务一个单独的日志文件,而“全局”日志仅在一行上提到启动了一个事务,如果适用,还可以添加最终结果的另一个条目。第三种解决方案是确保以某种方式标记日志条目,以便确定每行与哪个事务相关,并具有后处理工具,可以过滤日志以查看特定事务。
第二种解决方案(每个事务一个文件)可能会成为问题,如果您有非常频繁的事务,因为某些文件系统操作(特别是在网络上检查文件夹)会随着目录中文件数量的增加而变慢。第三种解决方案可以很好地工作(因为您可以向过滤/查看工具添加其他功能),但这意味着需要开发和维护另一个工具。
我不确定这是否是最佳方法,但我在我的代码中使用类似的东西
void Log( const char* msg ) {
#ifdef ENABLE_LOGGING
boost::mutex::scoped_lock lock(m_mutex);
// do a fprintf or what you want
#endif
}
当您从多个线程调用时,互斥锁确保此函数仅执行一次。
你很可能应该将日志记录器实例包装成Singleton,使用双重锁定创建日志记录器对象的实例以保护它免受初始化时的竞态条件。
这取决于您的应用程序需求。如果您想轻松查看所有线程中发生事情的顺序,则需要使用单个日志文件,并在线程之间同步访问它。如果每个线程或多或少独立运行,并且您只关心单个线程中发生的事情,则请为每个线程使用单独的日志文件。
我曾经创建过线程本地的记录器。可以配置多个日志池,只有当多个线程写入相同的文件池时才会出现锁定。
通过将记录器创建为线程本地,实现堆栈跟踪(在C/C++代码库中)相对容易。
你可以使用内存队列(在.NET 4中,System.Collections.Concurrent是线程安全的)。 然后让一个工作线程读取队列并将其记录到文件/数据库。