在程序中写日志是一件很是重要,可是很容易被开发人员忽视的地方。C++有挺多的日志库(如glog,log4cpp等),方便开发人员写日志。但通常这种log库考虑的是应用写log的方法。而C++做为轮子的制造者,迫切的需求是有一个轻量级的模块日志,方便开发人员在库内写日志。ios
在库内写日志,通常咱们使用printf、std::cout等,又或者嵌入一个log模块。当调用者须要按本身的方式写log时,这些常见的方法显得无能为力。若是存在一个log模块专为C++的导出模块设计,那么它应该具备哪些功能呢?app
Module内写日志,通常有如下几个问题须要考虑:函数
//mlog_def.hpp
#pragma once
/* ** 日志回调函数原型 ** @file 日志所在文件 ** @line 日志所在代码行 ** @func 日志所在函数 ** @severity 日志级别 ** @context 日志内容 */
typedef void(*MLogCallBack)(const char *file, int line, const char *func, int severity, const char *content);
复制代码
//mlog.hpp
#pragma once
#include <sstream>
#include <iostream>
#include <functional>
#include <string>
#include "mlog_def.hpp"
/* ** 用于在头文件内生成全局惟一对象 */
template<typename T>
class GlobalVar {
public:
static T VAR;
};
template<typename T> T GlobalVar<T>::VAR = nullptr;
/* ** 日志级别 */
#define MLOG_DEBUG 0
#define MLOG_INFO 1
#define MLOG_WARN 2
#define MLOG_ERROR 3
#define MLOG_FATAL 4
/* ** mlog */
namespace mlog
{
class LogMessage;
/* ** 日志回调设置函数 */
static void SetMlogCallBack(MLogCallBack func) { GlobalVar<MLogCallBack>::VAR = func; }
}
/* ** 日志回调生成类 */
class mlog::LogMessage
{
public:
LogMessage(const char* file, int line, const char* func, int severity, MLogCallBack callback)
: _file(file)
, _line(line)
, _func(func)
, _severity(severity)
, _callback(callback)
{
}
~LogMessage()
{
if (_callback)
{
std::string content = _stream.str();
_callback(_file.c_str(), _line, _func.c_str(), _severity, content.c_str());
}
}
std::ostringstream &stream() { return _stream; }
private:
std::string _file;
int _line;
std::string _func;
int _severity;
MLogCallBack _callback;
std::ostringstream _stream;
};
/* ** 实际使用宏 */
#define LOG_DEBUG mlog::LogMessage(__FILE__, __LINE__, __FUNCTION__, MLOG_DEBUG, GlobalVar<MLogCallBack>::VAR).stream()
#define LOG_INFO mlog::LogMessage(__FILE__, __LINE__, __FUNCTION__, MLOG_INFO, GlobalVar<MLogCallBack>::VAR).stream()
#define LOG_WARN mlog::LogMessage(__FILE__, __LINE__, __FUNCTION__, MLOG_WARN, GlobalVar<MLogCallBack>::VAR).stream()
#define LOG_ERROR mlog::LogMessage(__FILE__, __LINE__, __FUNCTION__, MLOG_ERROR, GlobalVar<MLogCallBack>::VAR).stream()
#define LOG_FATAL mlog::LogMessage(__FILE__, __LINE__, __FUNCTION__, MLOG_FATAL, GlobalVar<MLogCallBack>::VAR).stream()
复制代码
首先,Module中增长一个导出函数。ui
//mylibrary.h
#pragma once
#ifdef MYLIBRARY_EXPORTS
#define MYLIBRARY_API __declspec(dllexport)
#else
#define MYLIBRARY_API __declspec(dllimport)
#endif
#include <mlog/mlog_def.hpp>
MYLIBRARY_API void SetMyLibraryLogCallback(MLogCallBack logCallback);
复制代码
//mylibrary.cpp
#include "mylibrary.h"
#include <mlog/mlog.hpp>
MYLIBRARY_API void SetMyLibraryLogCallback(MLogCallBack logCallback) {
mlog::SetMlogCallBack(logCallback);
}
复制代码
在使用Module的程序或Module中,调用该函数设置日志回调。spa
//myapplication.cpp
#include <mlog/mlog_def.hpp>
#include "mylibrary.h"
void LogCallBack(const char *file, int line, const char *func, int severity, const char *content) {
//日志处理,能够写,也能够干其余的
}
int main(int ,const char*[]) {
//必要的各类初始化
SetMyLibraryLogCallback(LogCallBack);
//...
return 0;
}
复制代码