mxnet 源码阅读 3
mxnet/dmcl-core/include/logging.h
mxnet/dmcl-core/include/base.h
在mxnet/src/storage/gpu_device_storage.h 中包含了dmlc(Distributed Machine Learning Common Codebase) 的关于日志处理的函数LOG,其实质是dmlc的logging.h 头文件,
logging属于dmlc 名字空间,其中包含一些连接宏和几个类,分别对类 DateLogger LogMessage CustomLogMessage LogMessageFatal 进行介绍,
DateLogger 直接由无参数函数 HumanDate() 获取以冒号分割的当前系统时间,具体格式为 HH:MM:SS
LogMessage 构造函数有两个参数 一个为文件名,一个为行号,一般由编译器宏 __FILE__ __LINE__ 给出,其构造函数输出包装后的 DateLogger 格式为 [HH:MM:SS] FILE: LINE :
析构函数输出 "\n".作为换行结束,
同时拷贝构造函数和操作符= 用private修饰,用以禁止对该类的对象的拷贝和复制。
CustomLogMessage 是一个留出用户接口的类,只实现了LogMessage的构造函数类似的功能,至于析构函数和静态的Log函数没有具体实现,留给用户再具体使用是实现Log自定义输出。也就是说该类
在mxnet系统中没有直接,而是留给二次开发的开发者使用的。
LogMessageFatal 与上面的LogMessage类似,构造函数完全一致。析构函数多了处理异常和出错时的栈空间调用信息的输出,同时析构函数最后有abort()系统函数调用,用以终止进程:要么catch异常,要么abort()进程。Fatal函数的不可修复
注定了他的命运只能abort(); 该类和LogMessage对于拷贝构造和=运算符重载的处理也是一致的:私有化,防止了对该类的随意复用。
其余部分为模拟 google glog的宏
其中 LOG(INFO) LOG(WARNING) LOG(ERROR) 都是向 LogMessage的stream 中输出
LOG(FATAL) 是向 LogMessageFatal 的stream中输出信息
宏的拼写过程大概是
LOG(INFO) => LOG_INFO().stream() => dmlc::LogMessage(__FILE__, __LINE__).stream()
LOG(FATAL) => LOG_FATAL().stream() => dmlc::LogMessageFatal(__FILE__, __LINE__).stream()