65.9K
CodeProject 正在变化。 阅读更多。
Home

线程安全的日志记录器,自动从发布版本中删除日志消息

starIconstarIconstarIconstarIconstarIcon

5.00/5 (6投票s)

2000年9月14日

viewsIcon

106101

downloadIcon

1457

用于多线程应用程序的日志文件类

引言

这个类使得在多线程应用程序中使用日志文件成为可能,并且具有几个有用的特性,这些特性被广泛应用于我的多线程、对时间敏感的项目中,在这些项目中,Visual C++ 集成调试器具有非常有限的用途。

CDebugPrintf 类提供了一些有用的特性

  1. 在多线程应用程序中进行线程安全的日志记录。
  2. 自动从应用程序的发布版本中删除日志消息。
    您不再需要手动删除或注释掉发布版本中的日志消息。 发布版本将没有任何开销或未使用的信息在可执行文件中。
  3. 您可以同时从不同的应用程序将日志消息写入同一个文件。
    当需要探索两个或多个应用程序之间的交互和时序问题时,这很有用。
  4. 使用 printf 风格的格式文本:%s, %d, %4.1d 等。
    抱歉,但不支持浮点数。
  5. 日志文件中的每个消息都有日期和时间戳。
    此外,该类还提供从应用程序启动开始的时间差戳。
  6. 控制台输出以及对 GetLastError 函数返回的错误代码的轻松记录。
  7. 保存旧的日志文件。
  8. 仅使用 Windows API 函数。因此,即使在非 MFC 应用程序中也可以使用它。

该类易于使用。

  1. 将文件 dbg.hdbg.cpp 包含到您的项目中。
  2. 在您想将任何内容写入日志文件的任何时候,请使用 PRINTF 宏。

日志文件输出示例

0.000 08/25/2000 15:04:48  User name = KVA
0.015 08/25/2000 15:04:48  ISAPI = "TraxDataMgr.dll"
0.015 08/25/2000 15:04:48  CActionHandler constructor
0.015 08/25/2000 15:04:48  CDataMgrActionHandler constructor
5.123 08/25/2000 15:04:53  0   HttpExtensionProc: started
5.123 08/25/2000 15:04:53  Execute request 1 started.   
5.672 08/25/2000 15:04:53  CIndexer constructor: done
5.693 08/25/2000 15:04:53  Open:  D:\Data\Docs\customer
5.693 08/25/2000 15:04:53  Loading index table from 'D:\Data\Docs\customer.idx'
5.693 08/25/2000 15:04:53  Count: 93560
6.132 08/25/2000 15:04:54  Index loading finished ... OK
6.375 08/25/2000 15:04:54  Execute request 1 finished.   
6.375 08/25/2000 15:04:54  0   HttpExtensionProc: finished

类用法

void SomeFunction( char* arg1, int arg2, string& arg3 )
{
    // doing something
    ...
    PRINTF("Something happened by using %s and %d arguments", arg1, arg2);
    ...
    // doing something
    ...
    PRINTF(arg3);
    ...
    SHOW_CONSOLE();
    PRINTF("This message is visible on console and in log-file.");
}

备注

由于透明地从发布版本中删除日志消息存在问题,所有日志消息必须适应源代码的一行。

PRINTF("One line messages are supported.");
PRINTF("Multi-line messages %s %s",
           "are not",
           "supported.");

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.