Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

blog4go目前支持输出文件名和行号吗 #3

Open
hxiaodon opened this issue Mar 16, 2016 · 11 comments
Open

blog4go目前支持输出文件名和行号吗 #3

hxiaodon opened this issue Mar 16, 2016 · 11 comments

Comments

@hxiaodon
Copy link

你好
我在使用blog4go的过程中发现日志无法显示文件名和行号,这个后续打算支持吗?
如果支持,怎么能够避免原生log库利用runtime.Caller实现的性能问题?
非常感谢!

@hjweddie
Copy link
Member

在后续的开发中我们并没有打算支持显示文件名和行号。
我们在开发的过程中遇到runtime.Caller性能问题的时候,尝试了使用进程内一个map来做缓存,但是效果并不理想。
我们在线上程序实际使用的场景下,日志内容通常已经设置的能够反映问题所在。通过自己在日志内容中的标识也能很快的定位到log的调用位置。

@hxiaodon
Copy link
Author

我感觉 文件名 行号 在程序越来越复杂,或者参与开发的人越来越多的时候 打印出来还是很方便定位问题的
可不可以考虑用C/C++ 的__FILE__ LINE __func__的方式,日志库提供一个在编译前扫描替换的工具,这样运行期就没有任何损耗了
因为go语言层面不提供宏支持,所以代码没法封装做优雅
不过我认为提升了性能后,代码里写这样的调用(实际上增加了编译时间)是可以接受的
logs.Infof("%s %s %d %s",FILE LINE func,msg)

你的意见呢?

@hjweddie
Copy link
Member

请问一个日志库可以使用什么方法介入golang的编译阶段吗?日志库运行的时候程序不是都编译好了吗

@hxiaodon
Copy link
Author

我实现了一个简单粗糙的基于语法树分析的宏替换,已经发到你的公司邮箱(youmi.net),你看看可以当做不牺牲性能又要数据完整的补充吗?
ps: 其实就是利用这个工具在编译前遍历用户代码并做替换(最好在一个临时目录,不影响用户的工作环境,让用户无感知)

@hjweddie
Copy link
Member

我收到你的邮件了,谢谢~
我会仔细学习下里面的代码,稍后再回复下你。

@hjweddie
Copy link
Member

看完里面的代码,按照里面的实现方式,可以尝试做一个日志库的优化工具,需要在编译前执行,优化runtime.Caller的处理对吧?
这个我跟我的伙伴们商量下,看看工具该如何做好。
请问现在有其他开源的项目实现了这种功能吗?或者你有兴趣的话,我们很欢迎你提个pr帮助我们优化这个日志库~

@hxiaodon
Copy link
Author

是的, 类似C/C++编译器做的那样,先对用户的宏定义做计算以及替换,对模版方法进行模版实例化,生成最终的源代码(不要影响用户文件),然后编译执行
我还没有看到其它的开源项目(觉着应该有~),如果找到,第一时间通知你。近期项目比较紧张,没有时间来认真梳理并参与blog4go优化了....
有任何问题,邮件联系,谢谢!

@jjjachyty
Copy link

同求需要 显示具体哪个文件的哪一行

@yale8848
Copy link

yale8848 commented Nov 8, 2017

+1,同求啊,这个需求应该很多吧

@egmkang
Copy link
Contributor

egmkang commented Jan 3, 2018

之前有人给golang做过一个编译时期获取filename和lineno的扩展, 然后官方说我们不需要这个, 然后提供了一个runtime.Caller

@rfyiamcool
Copy link

提取行号太影响性能了吧. runtime.Caller 耗时都要到50ns了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants