`
yuanjinxiu
  • 浏览: 665924 次
文章分类
社区版块
存档分类
最新评论

第二人生的源码分析(4)Log调试功能的实现

 
阅读更多
对于一个比较复杂的软件来说,没有Log调试系统,就像一个人没有眼睛一样,看不到任何东西。对于一个能稳健运行的软件来说,Log调试系统是必须有的,否则这个软件是开发不成功的。如果在开发软件过程里,没有强调Log系统的实现,就等于这个软件运行的不稳定性已经存在其中,后期调试工作和源码维护都存在严重的问题。在《第二人生》的源码里已经开发一个非常容易使用的Log系统,这个Log系统具有如下特点:
1、 容易使用。
2、 分级调试信息输出。
3、 可重定向不同方式输出。
4、 可以运行时打开调试输出。
下面先来看看怎么使用Log系统,例子如下:
llinfos << "Saving settings to file: " << filename << llendl;
可以看出,它是跟C++库里的cout是差不多的,第一个<<操作符就是把字符串"Saving settings to file: "显示到Log里,第二个<<操作符就是文件名称显示到Log里,最后一个<<操作符紧跟着llendl宏定义,表示一行Log输出结束。llinfos接收后面所有字符串和对象,然后根据类型进行合适格式化输出到指定的目标文件或窗口里。
接着下来,仔细地分析llinfos是怎么样实现这么神奇的Log输出,满足上述的需求。先来看下面定义的几个宏:
#001/*
#002Error Logging Macros
#003See top of file for common usage.
#004*/
#005
#006#define lllog(level) /
#007{ /
#008 static LLError::CallSite _site( /
#009 level, __FILE__, __LINE__, typeid(_LL_CLASS_TO_LOG), __FUNCTION__);/
#010 if (_site.shouldLog()) /
#011 { /
#012 std::ostringstream* _out = LLError::Log::out(); /
#013 (*_out)
#014
#015#define llendl /
#016 LLError::End(); /
#017 LLError::Log::flush(_out, _site); /
#018 } /
#019}
#020
#021#define llinfos lllog(LLError::LEVEL_INFO)
#022#define lldebugslllog(LLError::LEVEL_DEBUG)
#023#define llwarns lllog(LLError::LEVEL_WARN)
#024#define llerrs lllog(LLError::LEVEL_ERROR)
#025
#026#define llcont (*_out)
从上面的代码可以看到llinfos是一个宏定义,也就是定义为lllog(LLError::LEVEL_INFO),通过宏定义展开就会生成如下的代码:
{
static LLError::CallSite _site(
LLError::LEVEL_INFO, __FILE__, __LINE__, typeid(_LL_CLASS_TO_LOG), __FUNCTION__);
if (_site.shouldLog())
{
std::ostringstream* _out = LLError::Log::out();
(*_out)
在这里先构造一个对象_site,然后根据shouldLog里的返回值是否需要输出Log,接着从LLError::Log::out()里获取接收信息和格式化的对象_out,把后面"Saving settings to file: " << filename输出到std::ostringstream的对象里。至于“<< llendl”的处理,就是通过<<操作符重载来实现处理的。因此所有宏定义的展开代码如下:
{
static LLError::CallSite _site(
LLError::LEVEL_INFO, __FILE__, __LINE__, typeid(_LL_CLASS_TO_LOG), __FUNCTION__);
if (_site.shouldLog())
{
std::ostringstream* _out = LLError::Log::out();
(*_out) << "Saving settings to file: " << filename <<
LLError::End();
LLError::Log::flush(_out, _site);
}
}
上面的代码主要使用到两个类:CallSiteLog。类CallSite主要实现调用输出Log位置的一些信息,比如当前函数的名称,或者当前源程序所有行号,又或者类的名称等等。类Log真正地实现Log的输出到文件,或者调试窗口。
分享到:
评论

相关推荐

    PHP实例开发源码—PhpLog 程序调试追踪功能实现源码.zip

    PHP实例开发源码—PhpLog 程序调试追踪功能实现源码.zip

    log4net源码

    **log4net源码分析** `log4net`是一款广泛使用的日志记录框架,它源自Java平台上的log4j,并被移植到了.NET环境中。这款开源库提供了强大的日志记录功能,支持多种输出方式,如控制台、文件、数据库等,且具有可...

    log4cpp源码完整解析

    完整分析了log4cpp的整体架构,详细介绍了log4cpp的这个重要组件的实现分析了log4cpp内部所使用的设计模式。介绍了log4cpp中的Category的完整实现细节,介绍了所有的Layout及其子类的具体实现。也详细介绍了比较常用...

    log4j源码 log4j源码

    Log4j的源码是公开的,允许开发者深入理解其内部工作原理,以便更好地利用它或者进行二次开发。 在Log4j源码中,有几个核心概念值得我们关注: 1. **Logger**:日志器是Log4j的核心组件,它负责接收日志信息并决定...

    基于PHP的Log程序调试追踪功能实现源码.zip

    基于PHP的Log程序调试追踪功能实现源码.zip

    基于PHP的Log 程序调试追踪功能实现源码.zip

    基于PHP的Log 程序调试追踪功能实现源码.zip

    log4j-1.2.17含源码

    源码分析方面,我们可以关注几个关键类:`org.apache.log4j.Logger`是日志记录的主要接口,`org.apache.log4j.Category`(Logger的实现)负责实际的日志记录,`org.apache.log4j.Appender`接口定义了日志输出的基本...

    log4j 1.2.15 源码

    在log4j 1.2.15源码中,我们可以深入研究这些核心组件的实现细节,例如Logger是如何根据配置文件进行初始化的,Appender是如何实现日志输出的,以及Level是如何影响日志过滤的。通过对这些关键部分的分析,开发者...

    log4cplus 源码(C++编写的开源的日志系统)

    log4cplus是C++编写的开源的日志系统,功能非常全面,用到自己开发的工程中会比较专业的,:),本文介绍了log4cplus基本概念,以及如何安装,配置。 ### 简介 ### log4cplus是C++编写的开源的日志系统,前身是java...

    log4qt源码

    《深入解析log4qt日志库源码》 在软件开发中,日志记录是必不可少的环节,它能够帮助开发者追踪程序运行状态,定位错误,优化性能。Log4Qt是Qt框架下的一个强大的日志系统,它借鉴了Java界的log4j设计模式,提供了...

    log4js Js调试

    `log4js`是一个受到Java社区广泛使用的日志框架`Log4j`启发的JavaScript库,它提供了强大的日志记录功能,适用于Node.js环境。本篇文章将详细介绍`log4js`的基本概念、配置、使用方法以及其在调试中的重要性。 ### ...

    log4net1.2.11.dll 和 log4net1.2.11源码

    源码分析对于理解log4net的工作原理和扩展其功能至关重要。通过阅读源码,开发者可以: 1. **理解内部工作流程**:查看Appender、Layout、Repository、Hierarchy等关键组件的实现,了解它们如何协同工作,记录、...

    log4cpp 日志 源码

    本文将深入探讨log4cpp的源码,揭示其内在的设计理念和实现机制,为C++开发者提供宝贵的学习资源。 一、log4cpp简介 log4cpp是基于Apache的log4j项目构建的C++版本,旨在为C++程序员提供类似的功能。它支持多线程...

    log4j 源码包 日志包 2.11.0

    通过对Log4j 2.11.0源码的深入研究,开发者不仅可以掌握其基本用法,还能了解其背后的实现机制,从而更好地利用这一强大的工具,提升开发效率,优化系统性能。同时,源码学习也是提升编程技能的重要途径,能帮助...

    Log4j工程官方源码

    - **学习与调试**: 可以通过阅读源码理解Log4j的内部实现,或者设置断点进行调试。 - **自定义扩展**: 如果需要,可以基于源码开发自己的Appender、Layout或Filter,并集成到项目中。 4. **应用场景** - **调试...

    Log4j_1.2.15 源码

    Log4j是Apache组织开发的...通过深入学习Log4j的源码,开发者可以更好地掌握日志管理,优化应用程序的日志输出,同时也能提升问题定位和调试的能力。对于Java开发者来说,理解并能灵活运用Log4j源码是一项重要的技能。

    log4net调试配置

    在C#开发中,日志记录工具log4net是一...通过学习和实践log4net的调试配置,开发者能够更快地定位问题,提高开发效率,实现更稳定可靠的软件产品。对于初学者而言,掌握log4net的基本用法和调试技巧是至关重要的一步。

    log4cpp源码

    **log4cpp源码分析** `log4cpp`是一个用于C++编程的开源日志库,它提供了类似于Java中的log4j的日志处理框架。这个库设计的目标是为应用程序提供灵活、可配置的日志记录机制,支持多种日志级别、输出目的地以及...

    Eclipse调试方法及log4j调试方法

    Eclipse调试方法及log4j调试方法Eclipse调试方法及log4j调试方法

Global site tag (gtag.js) - Google Analytics