Easylogging++ 共享日志库

     Easylogging++日志库是可以共享给动态库、静态库以及应用程序共同使用的。在Easylogging++日志库的源码中,有一个名为Storage的类,这个类负责维护Easylogging++日志数据库的主要入口,比如日志记录器的管理,日志配置的管理等都是在Storage类中完成的。

    默认情况下,我们每调用一次初始化宏INITALIZE_EASYLOGGINGCPP就会创建一个Storage对象,所以不同的程序就会有不同的Storage类对性爱那个在负责维护相应的日志记录器和日志配置。如果我们只创建一次Storage类对象,然后再将这个对象共享给其他使用Easylogging++日志库的程序使用,那么就可以保证所有程序都在使用同一个Storage类对象维护的日志记录器和日志配置,如同在单独的应用程序中使用日志记录一样方便和安全。

   为了使用共享的Storage类对象,在其他程序中我们不能用宏INITALIZE_EASYLOGGINGCPP来初始化日志库,应该改用以下两个宏定义中的任意一个:

   · INITIALIZE_NULL_EASYLOGGINGPP

   · SHARE_EASYLOGGINGPP

 如果使用宏INITIALIZE_NULL_EASYLOGGINGPP,那么必须调用函数el::Helpers::setStorage(el::base::type::StoragePointer)来设置共享的Storage类对象,否则将会运行出错;如果使用SHARE_EASYLOGGINGPP,那么必须将共享的Storage类对象作为参数传递进去。在 Easylogging++ V9.80 的版本中,如果使用宏 SHARE_EASYLOGGINGPP 编译会出现错误,提示无法解析的外部符号,下面是定义该宏的源码:

#define SHARE_EASYLOGGINGPP(initializedStorage)\  
    namespace el {\  
        namespace base {\  
            el::base::type::StoragePointer elStorage(initializedStorage);\  
        }\  
        el::base::debug::CrashHandler elCrashHandler(ELPP_USE_DEF_CRASH_HANDLER);\  
    }  

  解决编译出错的方法很简单,增加一个宏ELPP_INITI_BASIC_EDCLR即可,下面是修改之后的代码:

#define SHARE_EASYLOGGINGPP(initializedStorage)\  
    ELPP_INITI_BASIC_DECLR\  
    namespace el {\  
        namespace base {\  
            el::base::type::StoragePointer elStorage(initializedStorage);\  
        }\  
        el::base::debug::CrashHandler elCrashHandler(ELPP_USE_DEF_CRASH_HANDLER);\  
    }  

   其实,修改之后的代码就和另外一个宏 ELPP_INIT_EASYLOGGINGPP 的代码一模一样。有兴趣的小伙伴可以查看一下源码分别了解一下以下几个和初始化有关的宏定义:

 

   ·INITIALIZE_EASYLOGGINGPP

   ·ELPP_INIT_EASYLOGGINGPP

   ·INITIALIZE_NULL_EASYLOGGINGPP

   ·SHARE_EASYLOGGINGPP

     

    最后通过一个完整的演示工程来说明如何只创建一个 Storage 类对象,然后再将该对象共享给其他工程使用。在演示工程有下面四个项目:

Easylogging++ 共享日志库_第1张图片

   ShareEasylogging++项目,一个动态库工程,完成 Storage 类对象的创建,并提供获取该对象的接口,以便其他工程共享该对象。

   ShareEasyloggingDll1项目,一个动态库工程,演示了如何使用宏 SHARE_EASYLOGGINGPP 和共享的 Storage 类对象完成初始化。

    ShareEasyloggingDll2项目,一个动态库工程,演示了如何使用宏 SHARE_EASYLOGGINGPP 和共享的 Storage 类对象完成初始化。

    ShareEasyloggingTest项目,演示工程主程序,演示了如何使用宏 INITIALIZE_NULL_EASYLOGGINGPP 和共享的 Storage 类对象完成初始化。

 

参考:

https://www.yuque.com/docs/share/b77c4ea8-5e5a-4be8-828f-49d5eb9dba25

你可能感兴趣的:(C++,easylogging,Easylogging,共享日志库)