C++ logger 设计问题

2022-07-25 17:02:40 +08:00
 daemonLei

发帖问个 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 变量设置好,然后在执行正常流程; 但是第一种方法改造成本较高,第二种方法感觉不怎么优雅,所以想问问各位大佬还有什么别的办法。 希望各位大佬不吝指教。

1625 次点击
所在节点    C++
4 条回复
java253738191
2022-07-25 17:56:01 +08:00
类模版比较适合你
byaiu
2022-07-25 18:25:46 +08:00
crash safe 是什么意思
daemonLei
2022-08-06 16:32:48 +08:00
@java253738191 能具体说说怎么用类模板解决这个问题吗?
daemonLei
2022-08-06 16:33:16 +08:00
@byaiu 就是如果程序 crash 了,那么 crash 前的最后一条日志也能打印出来。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/868595

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX