go 官方版本的日志模块为什么加锁那么多

Titanarthas · 2018-04-21 16:46:46 · 3693 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-04-21 16:46:46 的主题,其中的信息可能已经有所发展或是发生改变。

看了下go的log模块代码,写一条日志的做法是

1,拼接日志内容

2,加锁

3,写文件

4,解锁。

这个做法在协程很多的情况下,效率比较低。

官方为啥没有提供一个高效率的版本呢?

我自己撸了一个,也就200多行代码(https://github.com/Titanarthas/s_g_log)

对比测试了下,50000个协程,每个协程写11条日志。

官方版本的log耗时是6秒多,我自己写的版本是2.4秒,也没发现我的实现有啥问题


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3693 次点击  
加入收藏 微博
13 回复  |  直到 2018-05-02 22:53:31
qiangmzsx
qiangmzsx · #1 · 7年之前

一个好的日志库非常难的,比如你写的代码就没有确保日志一定会写入到文件,你可以查看一下glog是如何实现的。你msgChan是无缓存的,如何确保不阻塞?

Titanarthas
Titanarthas · #2 · 7年之前
qiangmzsxqiangmzsx #1 回复

一个好的日志库非常难的,比如你写的代码就没有确保日志一定会写入到文件,你可以查看一下glog是如何实现的。你msgChan是无缓存的,如何确保不阻塞?

你说的这些问题我都处理了,缓存是配置文件里面可配置。exit函数可以确保写入文件。

hmly
hmly · #3 · 7年之前

func itoa(buf *[]byte, i int, wid int) 这个函数是干嘛的??意欲何为??

Titanarthas
Titanarthas · #4 · 7年之前

@hmly 代码都摆在那了,就那么几行,你都看不懂么

killernova
killernova · #5 · 7年之前

页面404了?

bensonfx
bensonfx · #6 · 7年之前

楼主链接多了一个右手括号。 还有一个文件中能根据环境变量或者在文件增加一个设置一个变量的方式,动态开关log 这个在实际调试还是挺实用的。

icexin
icexin · #7 · 7年之前

加锁主要是为了复用写日志的内存buffer,减轻内存压力,每条日志一次buffer申请只会加重内存分配器和gc的负担。另外你是怎么测试的,所有协程调完Printf之后就算结束了?如果是这样的话,日志都还在channel里面。按理来说都是串行写入,差别没有那么大。

Titanarthas
Titanarthas · #8 · 7年之前
icexinicexin #7 回复

加锁主要是为了复用写日志的内存buffer,减轻内存压力,每条日志一次buffer申请只会加重内存分配器和gc的负担。另外你是怎么测试的,所有协程调完Printf之后就算结束了?如果是这样的话,日志都还在channel里面。按理来说都是串行写入,差别没有那么大。

我的exit函数会阻塞,保证所有日志都写完才退出程序。我是从c/c++过来的,刚上手一个周。所以我是照搬c/c++的思想,先用锁缓存到一个内存队列,然后用一个专门的线程去处理这个队列。

Titanarthas
Titanarthas · #9 · 7年之前
killernovakillernova #5 回复

页面404了?

额,发文的时候急着下班回家。。没注意到贴链接的时候后面的括号被自动格式刷了。。

linkerlin
linkerlin · #10 · 7年之前

不需要换掉官方的日志库,只需要把写日志操作放到独立的协程进行即可.

Titanarthas
Titanarthas · #11 · 7年之前

@linkerlin 那会造成打印的行号时间函数名全在那个独立的协程里面

linkerlin
linkerlin · #12 · 7年之前
TitanarthasTitanarthas #11 回复

@linkerlin 那会造成打印的行号时间函数名全在那个独立的协程里面

可以把栈信息带过去.

254244460
254244460 · #13 · 7年之前

标准库仅仅只是提供一个基本能用的简单实现而已,如果觉得不够可以自己开发,不可能把什么都放进标准库。其次,谁说log必须写文件?如果是网络统一收集呢?又说,如果觉得慢,干嘛不在File上套一个bufio呢?另外可以看看这个 github.com/cihub/seelog

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传