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

LogDriver - 使用 C++ 的简化版 log4j

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.73/5 (7投票s)

2002年1月5日

BSD

5分钟阅读

viewsIcon

193002

downloadIcon

3531

Windows 平台上 C++ 的一些日志类。

引言

这是 CLog 类层次结构的 0.1 版本,请多包涵。这是本文的第二稿,希望新版本更好!

这是一个旨在简化 Windows 平台消息日志记录的类层次结构。我应该说明,将这些类移植到 *nix 系统非常简单。很明显,CEventLogAppender 需要被删除或重新利用。

这些类受到了 log4j 的启发。我是一位朋友介绍认识了 log4j,它是 Apache Jakarta 的一个子项目。该网站提供了更多信息的绝佳去处,请访问 http://jakarta.apache.org/log4j/docs/index.html

我最初检查 log4j 的主要原因是我被告知我当前的日志记录方法很差。我当然不相信。然而,在使用了 log4j 5 分钟后,我便认识到了这是事实!因此,我自然而然地踏上了寻找 log4cpp 的征程。嗯,log4j 网站上有两个不同项目的链接

一个在 http://sourceforge.net/projects/log4cpp/

另一个在 http://log4cplus.sourceforge.net/

我检查了它们,虽然它们各有优点,但对我来说都太复杂了。正是在这个时候,CLogCLogAppender 类诞生了。

目的

我决定创建一个具有真正简单而优雅的语法的日志类集。类似这样的东西

CLog myCLog(source);
myCLog.writeLog(debuglevel, message);

结果发现,这并不那么容易,但也很接近了。

工作原理

理解 CLog 层次结构的核心概念是严重性(severity)的概念。日志消息在创建时被赋予一个严重性。日志附加器(Log Appenders)在创建时被赋予一个严重性阈值(severity threshold)。然后,当一条消息的严重性大于附加器的阈值时,该消息就会被记录下来。

这可以更简洁地表示为:
严重性为 x 的消息,当 x >= y 时,会被写入严重性阈值为 y 的日志附加器。

严重性和阈值值的组织方式如下:
debug < info < warn < error < fatal

严重性/阈值

debug

详细的程序性信息消息,作为程序员在排查问题时的辅助手段。

信息

简短的信息性消息,作为生产支持和程序员在排查问题时的辅助手段。

warn

旨在通知帮助台、生产支持和程序员有关应用程序运行可能出现问题的消息。

error

详细说明程序错误的的消息,这些通常是面向帮助台、生产支持、程序员,有时也面向用户的消息。

fatal

严重的程序性违规消息,通常会导致应用程序失败。这些消息面向帮助台、生产支持、程序员,可能还面向用户。

所有这些“官话”的意思是,您作为程序员,有责任创建有意义的消息并为其分配正确的严重性。如果您在这方面做得好,您将获得极其信息丰富且具有标准化外观和感觉的日志的好处,使每个人的生活都更轻松。

项目文件

这个类集由多个文件组成;我将在此列出它们并附带简要说明。

头文件

Utility.h
包含一些有用的辅助数据结构
Log.h
主要的 CLog 类定义
LogAppender.h
抽象的 CLogAppender 类定义,特定的日志附加器将从中派生
ConsoleLogAppender.h
特定的控制台日志附加器类定义
FileLogAppender.h
特定的文件日志附加器类定义
EventLogAppender.h
特定的事件日志附加器类定义

实现文件

Utility.cpp
包含一些有用的辅助数据结构
Log.cpp
主要的 CLog 类实现
LogAppender.cpp
抽象的 CLogAppender 类实现
ConsoleLogAppender.cpp
特定的控制台日志附加器类实现
FileLogAppender.cpp
特定的文件日志附加器类实现
EventLogAppender.cpp
特定的事件日志附加器类实现

测试应用程序(驱动程序)

LogDriver.cpp
这个简单的测试应用程序将使用 log 和 log appender 类将消息写入控制台、test.dat 和事件日志。

试用

要使用日志记录类,请参考以下说明。

  • 您需要创建一个 .cpp 文件来“驱动”日志记录器 - 在我的例子中是 LogDriver.cpp
  • 包含 log.h,这将引入所需的定义等。
    #include "/inc/log.h"
  • 实例化一个 CLog 类的实例,这将是日志消息的“源”。
    CLog myLog("LogDriver");
  • 实例化并添加任意数量的日志附加器。
    CConsoleLogAppender * pConsoleLogAppender
              = new CConsoleLogAppender(nsCLog::info);
    CFileLogAppender * pFileLogAppender
              = new CFileLogAppender(nsCLog::warning, "test.dat");
    CEventLogAppender * pEventLogAppender
              = new CEventLogAppender(nsCLog::debug);
    
    myLog.addAppender(pConsoleLogAppender);
    myLog.addAppender(pFileLogAppender);
    myLog.addAppender(pEventLogAppender);
  • 在代码库的各个地方写入日志。
    myLog.writeLog(nsCLog::warning, "This is my test log message");	

您将完成以下工作:

  • 创建了一个源为“LogDriver”的日志记录器。
  • 创建了一个用于控制台消息的日志附加器。
  • 创建了一个用于将消息写入 test.dat 的日志附加器。
  • 创建了一个用于将消息写入事件日志的日志附加器。
  • 将这 3 个附加器告知 LogDriver 日志记录器。
  • 向各种日志写入了消息。

消息的外观将是:

01052002_124658 | LogDriver | warning | This is my test log message

事件日志消息的外观会略有不同,但基本相同。因为我比较懒,所以可能看起来像这样:

事件查看器中的条目

  Type: Error
  Date: 1/5/2002
  Time: 12:46:58 PM
  Source: LogDriver
  Category: (1500)
  Event: 0
  User: N/A
  Computer: Your Computer Name
消息(双击条目):无法找到源(LogDriver)中事件 ID(0)的描述。本地计算机可能没有必需的注册表信息或消息 DLL 文件来显示来自远程计算机的消息。事件中的以下信息:01052002_124658 | LogDriver | warning | 这是我的测试日志消息。

请告诉我您的想法 - 如果不是积极的,最好是建设性的,我并不要求人身攻击 :)。

在给我发送“应该这样做 X!”的消息之前,请阅读 _todo.txt 文档。

结论

就是这样了 - 真的。

© . All rights reserved.