V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
daemonLei
V2EX  ›  C++

C++ logger 设计问题

  •  
  •   daemonLei · 2022-07-25 17:02:40 +08:00 · 1604 次点击
    这是一个创建于 852 天前的主题,其中的信息可能已经有所发展或是发生改变。

    发帖问个 C++ logger 设计问题。 现有的 logger 设计成了单例且 crash safe 的,在 logger 初始化时可以设置输出到什么文件、日志级别之类的东西。这些设置项都是全局可访问的,换句话说都是 static 的。然后包装了几个宏来支持方便的日志打印功能,代码库中打印日志都是通过这些宏实现的。 我的代码库提供的接口都围绕这一个类,现在希望可以将 logger 绑定到这个类的实例上,由某个具体实例唤起的代码执行流共享同一个 logger, 不同的实例使用不同的 logger. 同时要尽量少的修改已有代码中打印日志的地方。 目前我能想到的两个方法分别是: 1 、将原先 static 的变量改成 non-static 的,代码库中所有的类可能使用日志打印的类都加一个成员变量持有 logger 实例,所以普通函数和类的静态成员函数都加一个参数支持将 logger 传进来; 2 、用一个全局的 hash map 维护 logger 实例到某个类的实例的映射,然后将原先 static 的变量都改成 thread_local static 的,每个线程在最开始将自己的 thread_local 变量设置好,然后在执行正常流程; 但是第一种方法改造成本较高,第二种方法感觉不怎么优雅,所以想问问各位大佬还有什么别的办法。 希望各位大佬不吝指教。

    4 条回复    2022-08-06 16:33:16 +08:00
    java253738191
        1
    java253738191  
       2022-07-25 17:56:01 +08:00
    类模版比较适合你
    byaiu
        2
    byaiu  
       2022-07-25 18:25:46 +08:00
    crash safe 是什么意思
    daemonLei
        3
    daemonLei  
    OP
       2022-08-06 16:32:48 +08:00
    @java253738191 能具体说说怎么用类模板解决这个问题吗?
    daemonLei
        4
    daemonLei  
    OP
       2022-08-06 16:33:16 +08:00
    @byaiu 就是如果程序 crash 了,那么 crash 前的最后一条日志也能打印出来。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1953 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 00:42 · PVG 08:42 · LAX 16:42 · JFK 19:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.