voreen 日志文件系统分析

voreen的日志文件系统分为日志类和日志管理类,log和logManage类;

log是整个不同日志类的基类,在此类的基础之上,根据需要定义了文本log类(TextLog)、HTML log类(HtmlLog)、以及console log类(consoleLog);

LogManager类负责统一管理整个日志类,并通过该类将消息分发给所有的日志类;

具体而言:

    voreen定义了日志的级别

/**
 * Specifies the severity of the log event.
 * Debug messages are not logged in release builds!
 */
enum LogLevel {
    Debug,
    Info,
    Warning,
    Error,
    Fatal
};

  voreen定义了每一log类所能处理的日志信息过滤器

/**
 * Holds the information for filtering messages.
 */
struct TGT_API LogFilter {
    std::string cat_;
    bool children_;
    LogLevel level_;
};

基类log提供了两个保护函数分别为:

virtual bool testFilter(const std::string &cat, LogLevel level);
    virtual void logFiltered(const std::string &cat, LogLevel level, const std::string &msg,
                             const std::string &extendedInfo = "") = 0;

当有信息需要log时,testFilter根据该log对应的filter的信息,判断信息是否可以被处理,然后调用logFiltered函数向日志中添加信息

log类整体关系如下:

logManager类用于管理所有的日志类,主要负责添加删除log类,处理所有日志信息等;

应用程序调用logManager中的log函数,该函数将所有的信息统一分发给各个log类,然后由每个log类的log函数根据自己的实际情况处理(即基类的两个保护函数)对应的日志信息。

logManager利用voreen定义的宏,来使用singleton模式,保证全局只有一个logManger实例。该singleton宏定义如下:

#define SINGLETON_CLASS_HEADER(T) public:static void init() {tgtAssert(!singletonClass_, "singletonClass_ has already been initialized." );singletonClass_ = new T;tgtAssert(singletonClass_, "singletonClass_ has not been created.");}static void deinit() {tgtAssert(singletonClass_, "singletonClass_ has already been deinitialized." );delete singletonClass_;singletonClass_ = 0;}static T* getPtr() {tgtAssert(singletonClass_, "singletonClass_ has not been intitialized." );return singletonClass_;}static T& getRef() {tgtAssert(singletonClass_ , "singletonClass_ has not been intitialized." );return *singletonClass_;}static bool isInited() {return (singletonClass_ != 0);}protected:static T* singletonClass_;
#define SINGLETON_CLASS_SOURCE(T) T* T::singletonClass_ = 0;

宏参数T为logManager类;

并通过宏获得该全局实例:

#define LogMgr tgt::LogManager::getRef()

voreen 通过do.....while(0)的应用来定义不同的宏,用于处理不用级别的信息,该宏定义如下所示:

 #define LDEBUG(msg)         do {             std::ostringstream _tmp, _tmp2;             _tmp2 << __FUNCTION__  << " File: " << __FILE__ << "@" << __LINE__;            _tmp << msg;             LogMgr.log(loggerCat_, tgt::Debug, _tmp.str(), _tmp2.str());         } while (0)

其中do......while(0)的妙用在下面中有讲到http://www.cnblogs.com/flying_bat/archive/2008/01/18/1044693.html

其中注意到loggerCat_变量的定义如下:

static const std::string loggerCat_;

对于每一个需要使用日志功能的模块都需要定义该静态变量;从而保证在通过宏LDEBUG调用时,可以根据cat类别进行日志信息的输出;

时间: 2024-08-07 17:29:05

voreen 日志文件系统分析的相关文章

SQL存储过程删除数据库日志文件的方法

--日志文件收缩至多少M DECLARE @DBLogSise AS INT SET @DBLogSise=0 --查询出数据库对应的日志文件名称 DECLARE @strDBName AS NVARCHAR(500) DECLARE @strLogName AS NVARCHAR(500) DECLARE @strSQL AS VARCHAR(1000) SELECT @strLogName=B.name, @strDBName=A.name FROM master.sys.databases

expdp导出遇到ORA-39064: 无法写入日志文件

. . 导出了 "USER_XXXX"."TAB_YYYY" 0 KB 0 行 ORA-39064: 无法写入日志文件 ORA-29285: 文件写入错误 经过搜索mos,有如下的文章给出了解决方案: Error ORA-39064 Might Be Encountered By DataPump Export (EXPDP) When NLS_LANG Is Different From Database Character Set (Doc ID 1321034

windows服务器清理系统垃圾日志文件

Windows服务器的系统盘如果是2003系统的话那么我们默认给10G的空间就够了,但是有时候我们不经意去查看系统盘的时候发现已经使用了9.9G,其实多是垃圾日志文件占用系统盘空间,使用如下批处理将这些文件删除. 在桌面新建一个文本文档,将如下代码复制进去: @echo off echo 正在清除系统垃圾文件,请稍等...... del /f /s /q %systemdrive%\*.tmp del /f /s /q %systemdrive%\*._mp del /f /s /q %syst

MySQL日志文件与分析

1.查询日志.慢查询日志.二进制日志对比 查询日志 general_log 会记录用户的所有操作,其中包含增删查改等 可以指定输出为表 慢查询日志 slow_log 只要超过定义时间的所有操作语句都记录 可以指定输出为表 二进制日志 log_bin 记录可能执行更改的所有操作 mysqlbinlog查看 2.日志的分析 2.1日志的存储 数据操作过程中,Mysqld是将接收到的语句按照接收的顺序(注意不是执行顺序)写到查询日志文件中.一条一条就类似这样: # Time: 070927 8:08:

用于监控日志文件的是否被修改的脚本

最近一段需要监控观察web服务器上的日志文件是否有写入,用来判断是否服务进程是否是正常,为此就简单写了一个脚本: #!/bin/bash #check_logfile_io.sh #Used to monitor logs I/O #writer jim #histor #2017.3.22 log_file_path=/usr/local/apache/log/access.log First_md5sum=$(/usr/bin/md5sum $log_file_path | awk '{pr

IIS 7 出现日志文件时间与服务器时间不符

最近在分析web日志,发现IIS7日志中时间与系统时间不一致,即本该上班时间才产生 的产并发访问日志,全部发生在凌晨至上班前. 本以为是系统时间设置错误,检查后一切正常.后查询资料,原来是这个原因: 日志的格式有IIS.NCSA.W3C三种: 1.IIS是固定的基于 ASCII 文本的格式,无法自定义记录的字段,字段由逗号分隔, 记录的时间为本地时间文件名前缀为u_in. 2.NCSA是美国国家超级计算技术应用中心 (NCSA) 公用日志文件格式,也是固定的基 于 ASCII 文本的格式,无法自

windows 日志文件查找符合条件的列并统计

因为要将windows每天登陆失败的次数统计, "wevtutil el  "           //列出日志名称 "wevtutil  gl  日志名称" //获取日志配置信息. 你可以使用短(如 ep /uni)或长(如enum-publishers /unicode)形式的命令和选项名称. 命令.选项和选项值不区分大小写. 变量均使用大写形式. wevtutil COMMAND [ARGUMENT [ARGUMENT] ...] [/OPTION:VALUE

log4net 既要按日期分割日志文件,又要按文件大小分割。

<appender name="DebugAppender" type="log4net.Appender.RollingFileAppender"> <file value="log\debug\"/> <appendToFile value="true" /> <rollingStyle value="Composite" /> <datePatte

(Unity)Unity自定义Debug日志文件,利用VS生成Dll文件并使用Dotfuscated进展混淆,避免被反编译

Unity自定义Debug日志文件,利用VS生成Dll文件并使用Dotfuscated进行混淆,避免被反编译. 1.打开VS,博主所用版本是Visual Studio 2013. 2.新建一个VC项目,选择类库,取名为JefferyChan,具体步骤如下图: 3.因为要调用Unity中的相关文件,所以这里要引入外部文件.首先在Unity的安装文件夹中找到UnityEngine.dll,我的路径是:D:\Program Files (x86)\Unity\Editor\Data\Managed 如