请教如何打 log,性能最好

2022-07-11 16:58:37 +08:00
 ligiggy

如果每打一句 log ,就阻塞住,通过 filestream 往文件中写入一句 log ,写入很多次(比如 10000 次),多少会影响程序性能。

想请教各位大佬,性能最好的 log 方案是什么样的?

5123 次点击
所在节点    C++
31 条回复
MoYi123
2022-07-11 17:04:21 +08:00
一般会弄个队列异步写文件, 性能最好的应该是 log4j2 里用的 disruptor 吧.
这东西还是找找成熟的第三方库吧, 没必要自己写.
ligiggy
2022-07-11 17:08:14 +08:00
@MoYi123 c++好像不是 log4j2 ,异步写的话,要缓存,然后开线程吧,会不会还不如直接写到文件里。
xhldtc
2022-07-11 17:13:09 +08:00
log4j = log for java, C++应该没这玩意吧
lonewolfakela
2022-07-11 17:13:30 +08:00
c++先上 https://github.com/gabime/spdlog ,不够用再研究别的
MoYi123
2022-07-11 17:14:11 +08:00
@ligiggy 缓存比直接写估计快 50-60 倍左右吧. 不过具体还是要看 benchmark.
MoYi123
2022-07-11 17:16:28 +08:00
@ligiggy 我指的是 log4j2 里用的数据结构 disruptor 是我知道的最快的处理日志的方案.
ligiggy
2022-07-11 17:25:14 +08:00
@lonewolfakela 大概浏览了下 spdlog 的异步写 log ,看到了 std::vector<std::thread>,感觉不会很快。主要是我没有实现方案,有的话,可以自己实现一个功能简单一点的。
ceflib
2022-07-11 17:27:57 +08:00
log4cpp? 可以看看 glog
ligiggy
2022-07-11 17:28:00 +08:00
@MoYi123 好像开源库都是基于 std::thread 实现的,看来没法避免线程了,我去研究下吧
novolunt
2022-07-11 17:28:43 +08:00
log ==> null
ligiggy
2022-07-11 17:31:35 +08:00
@novolunt 什么意思。。。。
chengengshen
2022-07-11 17:33:21 +08:00
google 的 log 库
4771314
2022-07-11 17:33:42 +08:00
@novolunt respect
s127
2022-07-11 18:21:32 +08:00
zjwugiv2
2022-07-11 18:54:41 +08:00
异步缓存,,
yulon
2022-07-11 19:16:11 +08:00
发到别的线程是内存操作,写到磁盘是 I/O 操作,内存操作肯定比 I/O 操作要快,你可能觉得整体的时间增加了,但对于产生 log 的那个线程,就不用负担 I/O 的时间了。
bsg1992
2022-07-11 19:55:14 +08:00
同步调用,异步落盘
cloverstd
2022-07-11 20:30:31 +08:00
往标准输出和磁盘写,都要异步非阻塞,不然会因为这两个 IO 会影响到你的程序的
cxytz01
2022-07-11 20:55:21 +08:00
对性能要求奇高,可以写入 mmap 里面,然后 log 进程搜集。腾讯是这么做的。
BeautifulSoap
2022-07-11 21:03:08 +08:00
歪一下,大部分服务都跑云服务了,所以直接往标准输入输出里输出就行。云服务会自己收集输出的日志

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

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

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

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

© 2021 V2EX