首先我面壁,我是码农!
我公司有一套自己写的log组件,这个组件最大的神奇之处就在于跨进程的log。这个是我第一次见,之前写的程序也没有这方面需求,只是自己log写文件就ok了。
但是我有个想法,这跨进程挺好的,可是万一我想跨机器log了,这不就嗝屁了吗?
不行!
于是自己折腾了一个log。当然是通过tcp了,这样有网络就行了。整个log只用了一个锁,跨进程间是不会互相影响的。即便这个锁,也是加在一个循环队列的buffer上的。以后完全有可能使用无锁的方式优化掉,这就相当于这个log组件完全无锁。唯一的缺点就是需要跑一个logserver来接收程序的log,当然你也是连在这个server上看log的。同时正在做一个web的前台,用户可以再前台设置log级别,查看log。最后,亲,跨平台的哦,支持windows/linux , c、c++、java哦,欢迎购买,包邮哦!
目前粗则了下性能,本机能够达到每秒5w+,log一个不丢。比较了下,功能没有log4cxx强大,但速度比log4系列的有优势。而且可以动态调整log级别。另外,在log极多的情况下,查看log的用户数越多,性能会下降。
然后,我深知诸多大神鄙视这种造轮子的行为,可TMD的真的没找到能跨机器log的东西啊啊啊啊啊。。。。。
log4CXX到是有socket的appender,可那个东西的效率实在不能接受的。
下面主要说具体的做法:
其实这玩意说白了就两件事:
1、从tcp接收纯文本。
2、把文本从tcp发出去。
但搞对了就不那么容易了,搞好了,就更难了。
如果你尝试写一个,你会发现以下的问题
1、tcp粘包的,拆包的问题。既如何区分出一条完整的log,这个不难。
2、网络异步的发送和接收。当然不能用同步的,那会导致导致恩你自己想。。。
3、log的格式自定义,这个有点难度。
4、动态log级别调整,这个也有难度。
5、网络异常后自动恢复。这个不难。
搞好了,就涉及到以下问题。
1、尽一切可能减少copy。这个用了shareptr来解决。
2、尽可能减少malloc。这个找了一个mempool来解决。(效果不明显)
3、在lan上是没有问题,在wan上就需要考虑数据的压缩。log都是纯文本,压缩来减少数据传送。当然,配套的读log的东西也是要自己写的。
4、多线程的问题,每连接一个线程的模型是不能接受的。事实上,数据接收和处理各有一个线程,两个线程而已(当然线程数目是可以配置的)。数据接收和发送各有一个thread pool。
5、界面。这个仁者见仁了,可能大部分人认为log还有个界面,不能理解。事实上,这玩意很有用,真的!
插播新闻:c++0x上个星期投票通过了!!!
boost是个好东西,居家旅行,杀人放火必备良器。boost:: shared_ptr boost::function boost:: bind boost::asio这些东西都太犀利了。 当然学习成本是有点高,而且这玩意难调得一腿啊,当时少写了个括号,报了几十个错误,还没一个错误正确指出错误的地方,shit!不过用熟悉了,也就知道怎么回事了,运行时错误,跟到boost代码里面,大部分也都豁然开朗了。现在公司里面就用stl,我经常想,要是这玩意用boost,至于写那么多线程,那么多锁吗。。。。还有就是那个ptlib,也不是说它不好,可是这玩意太小众了,还有一堆莫名其妙的地方。资料也木有,只能看源码,不过我也不想看,有时间看他的,还不如看看boost的。
看源码的话,现在小有点经验了,体验也多了,记得以前最怕看别人写的东西。在调程序的时候,看到boost的源码,当时就想说tnnd,竟然可以这样写。。。
今天就废话这么多,看哈利波特去了。



Recent Comments
@又秀逗了
@Waiting U Here
@贴一个自己用的log4j配置的模板
@评论开启
@今天过生日