LogDriver - 使用 C++ 的简化版 log4j
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/
我检查了它们,虽然它们各有优点,但对我来说都太复杂了。正是在这个时候,CLog
和 CLogAppender
类诞生了。
目的
我决定创建一个具有真正简单而优雅的语法的日志类集。类似这样的东西
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 文档。
结论
就是这样了 - 真的。