日志库EasyLogging++学习系列(11)—— 共享日志库

在前面的学习系列文章中,我们都是在单独的一个应用程序中使用 Easylogging++ 日志库。其实 Easylogging++ 日志库是可以共享给动态库、静态库以及应用程序共同使用的。在编写一些大型程序的时候,我们往往会把各个功能分别封装成一个动态库,然后再编写一个主程序来负责调用这些动态库就可以了。现在假设我们想在主程序和各个动态库中都使用 Easylogging++ 来记录日志,那么我们需要在主程序和各个动态库中的代码中都包含 Easylogging++ 的头文件,然后再分别设置主程序和各个动态库的日志配置。这是一个非常繁琐的事情,而且很容易把主程序和各个动态库中的日志配置成保存在同一个文件里,这可能会造成多个动态库同时对同一个日志文件进行写操作的情形,从而可能会使得日志内容乱成一团。但是因为主程序和各个动态库合并起来才算是一个完整的程序,我们又确实想把主程序和各个动态库中相同级别的的日志都保存在同一个文件中,那么我们只需要使用 Easylogging++ 的共享功能,就可以完美地满足我们的需求,并且还能避免上述所说的问题。

在 Easylogging++ 日志库的源码中,有一个名为 Storage 的类,这个类是负责维护 Easylogging++ 日志库数据的主要入口,比如日志记录器的管理,日志配置的管理等都是在 Storage 类中完成的。默认情况下,我们每调用一次初始化宏 INITIALIZE_EASYLOGGINGPP 就会创建一个 Storage 类对象,所以不同的程序就会有不同的 Storage 类对象在负责维护相应的日志记录器和日志配置。如果我们只创建一次 Storage 类对象,然后再将这个对象共享给其他使用 Easylogging++ 日志库的程序使用,那么就可以保证所有程序都在使用同一个 Storage 类对象维护的日志记录器和日志配置,如同在单独的应用程序中使用日志记录一样方便和安全。

为了使用共享的 Storage 类对象,在其他程序中我们不能用宏 INITIALIZE_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_DECLR 即可,下面是修改之后的代码:

#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 类对象,然后再将该对象共享给其他工程使用。在演示工程有下面四个项目:

 

  • ShareEasylogging++项目,一个动态库工程,完成 Storage 类对象的创建,并提供获取该对象的接口,以便其他工程共享该对象。
  • ShareEasyloggingDll1项目,一个动态库工程,演示了如何使用宏 SHARE_EASYLOGGINGPP 和共享的 Storage 类对象完成初始化。
  • ShareEasyloggingDll2项目,一个动态库工程,演示了如何使用宏 SHARE_EASYLOGGINGPP 和共享的 Storage 类对象完成初始化。
  • ShareEasyloggingTest项目,演示工程主程序,演示了如何使用宏 INITIALIZE_NULL_EASYLOGGINGPP 和共享的 Storage 类对象完成初始化。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Easylogging是一个简单易用的日志,它可以帮助开发人员在程序运行过程中记录并追踪各种日志信息。它提供了许多便捷的方法,使开发人员能够根据实际需要对日志进行配置,并将其输出到不同的地方,如控制台、文件等。 多线程是一种在同一个进程中同时执行多个任务的方法。多线程可以提高程序的并发性和效率,但也会带来一些问题。其中一个常见的问题是内存暴涨。 内存暴涨指的是程序在运行过程中占用的内存空间急剧增加。多线程程序中,每个线程都有自己的栈空间,用于存储局部变量等数据。当多个线程同时执行时,可能会导致大量的栈帧被同时创建和销毁,从而占用大量的内存空间。此外,多线程程序还可能存在共享数据的问题,需要使用一些同步机制来保证数据的正确性,这也会增加内存的开销。 为了解决多线程程序中的内存暴涨问题,可以采取一些措施。首先,可以对线程进行优化,尽量减少线程的创建和销毁次数,减少栈空间占用。其次,可以优化共享数据的访问方式,使用一些高效的同步机制,如读写锁、原子操作等,减少内存开销。此外,还可以使用一些内存管理工具来监测和调优程序的内存使用情况,及时发现和解决内存暴涨问题。 总结来说,Easylogging可以帮助我们方便地记录和追踪日志信息,多线程能够提高程序的并发性和效率,但同时也会带来内存暴涨的问题。为了解决内存暴涨,我们可以采取一些优化措施,减少线程的创建和销毁次数,优化共享数据的访问方式,并使用内存管理工具监测和调优程序的内存使用情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值