{技术}{C++} log库推荐?windows下使用。google-glog/boost::log都pass了

965 views
Skip to first unread message

frank28

unread,
Aug 18, 2010, 11:06:50 PM8/18/10
to TopLanguage
= 关于google-glog =
一直想加个log库,本来glog关注满久的了,也见到之前Shuo Chen的推荐,打算就认它了,结果用了才知道世界没那么完美的。

编译以及加上gflags支持,这些都搞定了。
最大的问题是有内存泄漏。
我们项目是严格要求vs退出时不允许报内存泄漏的,粗略看了下glog的代码,结果发现人家new了不delete的地方比比皆是啊。虽然说人家好像要
么是static的,要么是都加了空判断保证只会new一次,但最后却没个整体清理的地方,这个总不是啥好习惯吧?Linux下这些就不重要嘛?还是真
的就是小细节?总之这一点,估计glog九成九要毙掉了……

= boost::log =
虽然最近才正式批准进了boost的样子,但看了review结果中的critical issues(http://
lists.boost.org/boost-announce/2010/03/0256.php),觉得还是算了。况且在项目里推boost实在是
吃力不讨好……

那么各位还有其它c++的log库的推荐呢?

SpitFire

unread,
Aug 18, 2010, 11:12:38 PM8/18/10
to pon...@googlegroups.com
我使用的是log4cplus,当前版本1.0.3



--
SpitFire

huan yi

unread,
Aug 18, 2010, 11:22:14 PM8/18/10
to pon...@googlegroups.com
赞同,用log4系列把
2010/8/19 SpitFire <spit...@gmail.com>



--
Huan Yi
now: Asiainfo-Linkage
prev: HUST

机械唯物主义 : linjunhalida

unread,
Aug 18, 2010, 11:38:38 PM8/18/10
to pon...@googlegroups.com
log4是那个?上连接吧。最好是介绍有个页面专门介绍windows toolchan的。

2010/8/19 huan yi <hy86...@gmail.com>

机械唯物主义 : linjunhalida

unread,
Aug 18, 2010, 11:38:58 PM8/18/10
to pon...@googlegroups.com
还有其他的toolkit。windows在这个方面没有linux好。

2010/8/19 机械唯物主义 : linjunhalida <linjun...@gmail.com>

pi1ot

unread,
Aug 18, 2010, 11:43:58 PM8/18/10
to TopLanguage
glog是google出品?难道他们认为内存泄漏和磁盘故障一样是随时可以发生的日常情况了

Jianfei Wang

unread,
Aug 18, 2010, 11:47:26 PM8/18/10
to pon...@googlegroups.com
http://code.google.com/p/google-glog/

库还是很优秀的,不过开发者本来就没以Windows为目标平台,只是做了简单支持,所以Windows上比较悲剧。不过内存泄漏应该在Linux版本中也有,但如前所说,都是static或者在neww前做了null判断的,只是最后没有主动delete。理论上不是问题,但应该不是好的taste吧。


2010/8/19 pi1ot <pilot.cn@gmail.com>
glog是google出品?难道他们认为内存泄漏和磁盘故障一样是随时可以发生的日常情况了
-- 
Jianfei WANG (frank28_nfls)

Twitter @frank28_nfls

Yongwei Wu

unread,
Aug 18, 2010, 11:46:53 PM8/18/10
to pon...@googlegroups.com
如果只new一次,可以认为不是内存泄漏。但问题是不利于内存调试,仍然不太好。

2010/8/18 pi1ot <pilo...@gmail.com>:

--
Wu Yongwei
URL: http://wyw.dcweb.cn/

Yongwei Wu

unread,
Aug 18, 2010, 11:45:56 PM8/18/10
to pon...@googlegroups.com
造一个新轮子,嘿嘿。

看过log4系列,跟我们的项目需求还是觉得不能很好匹配。自己实现了一个,也就500行左右的实际代码。

2010/8/18 frank28 <fra...@gmail.com>:

--

Jianfei Wang

unread,
Aug 19, 2010, 1:44:10 AM8/19/10
to pon...@googlegroups.com
log4j抄过来的库有点多啊,起了好多山头,不过夸好用的还真不多。

有个想法是给glog打补丁吧,比造轮子应该还是省点事儿,懒嘛,呵呵。
而且glog还是实现了很多实用功能的,比如条件log,这些全实现了估计500行搞不定。

2010/8/19 Yongwei Wu <wuyo...@gmail.com>
造一个新轮子,嘿嘿。

看过log4系列,跟我们的项目需求还是觉得不能很好匹配。自己实现了一个,也就500行左右的实际代码。

--
Wu Yongwei
URL: http://wyw.dcweb.cn/

jiang yu

unread,
Aug 19, 2010, 2:27:50 AM8/19/10
to pon...@googlegroups.com
我来解释下为什么他没有delete
因为有可能一个类在析构的时候做log
end::~end()
{
  log << "end";
]
而这个end类又可能是全局的或者静态的,无法保证他先于log析构,所以只能不delete。

chuang

unread,
Aug 19, 2010, 2:54:34 AM8/19/10
to pon...@googlegroups.com
条件log不难吧?就是一个宏判断就好了啊
其实glog核心功能就那一个文件:logging.cc里面全有了 比起log4系列 还是很精简的.

2010/8/19 Jianfei Wang <fra...@gmail.com>

Jianfei Wang

unread,
Aug 19, 2010, 5:02:09 AM8/19/10
to pon...@googlegroups.com
受教

2010/8/19 jiang yu <yu.jia...@gmail.com>

我来解释下为什么他没有delete
因为有可能一个类在析构的时候做log
end::~end()
{
  log << "end";
]
而这个end类又可能是全局的或者静态的,无法保证他先于log析构,所以只能不delete。
 

chuang

unread,
Aug 18, 2010, 11:57:04 PM8/18/10
to pon...@googlegroups.com
>>结果发现人家new了不delete的地方比比皆是啊

比如?我没有遇到你说的问题.

2010/8/19 Jianfei Wang <fra...@gmail.com>

Jianfei Wang

unread,
Aug 19, 2010, 8:57:26 PM8/19/10
to pon...@googlegroups.com
check svn上最新的代码

logging.cc:
605:     log_destinations_[severity] = new LogDestination(severity, NULL);
1571:   logging_directories_list = new vector<string>;
447:     if (!sinks_)  sinks_ = new vector<LogSink*>;

grep一下吧

2010/8/19 chuang <lichua...@gmail.com>
>>结果发现人家new了不delete的地方比比皆是啊

比如?我没有遇到你说的问题.

chuang

unread,
Aug 19, 2010, 10:06:18 PM8/19/10
to pon...@googlegroups.com
这些都是全局对象吧.你用比如singleton之类的做法,其实本质也一样的.

2010/8/20 Jianfei Wang <fra...@gmail.com>

Jianfei Wang

unread,
Aug 19, 2010, 10:15:14 PM8/19/10
to pon...@googlegroups.com
我之前也说了,理论上这样是没问题,只是项目要求必须vs退出时0泄漏,前面也有朋友说了不这样“不利于内存调试”。我们的singleton全都是在main退出前要求手动释放的。

2010/8/20 chuang <lichua...@gmail.com>
这些都是全局对象吧.你用比如singleton之类的做法,其实本质也一样的.


Jianfei Wang

unread,
Aug 19, 2010, 10:17:49 PM8/19/10
to pon...@googlegroups.com
我还蛮好奇,你在什么平台下用glog?我没Linux,不知道Valgrind对于这样的全局对象会不会报内存泄漏?

2010/8/20 chuang <lichua...@gmail.com>
这些都是全局对象吧.你用比如singleton之类的做法,其实本质也一样的.


--
Jianfei WANG (frank28_nfls)

Twitter @frank28_nfls

qiaojie

unread,
Aug 19, 2010, 10:21:20 PM8/19/10
to pon...@googlegroups.com
要解决这个问题很简单,把new/delete重载了指向你自己的内存分配器,然后程序退出的时候把你的内存分配器一次性释放掉,这样就不会报内存泄漏了。


 
2010/8/20 Jianfei Wang <fra...@gmail.com>

Jianfei Wang

unread,
Aug 19, 2010, 10:25:02 PM8/19/10
to pon...@googlegroups.com
2010/8/19 jiang yu <yu.jia...@gmail.com>
我来解释下为什么他没有delete
因为有可能一个类在析构的时候做log
end::~end()
{
  log << "end";
]
而这个end类又可能是全局的或者静态的,无法保证他先于log析构,所以只能不delete。

2010/8/20 qiaojie <qia...@gmail.com>
要解决这个问题很简单,把new/delete重载了指向你自己的内存分配器,然后程序退出的时候把你的内存分配器一次性释放掉,这样就不会报内存泄漏了。

archer

unread,
Aug 19, 2010, 10:27:15 PM8/19/10
to pon...@googlegroups.com
How about this: http://logging.apache.org/log4cxx/index.html


2010/8/20 Jianfei Wang <fra...@gmail.com>

Jianfei Wang

unread,
Aug 19, 2010, 10:32:29 PM8/19/10
to pon...@googlegroups.com
not very interested in apache's solution, too many dependencies as I can remember

2010/8/20 archer <arch...@gmail.com>

Eric Miao

unread,
Aug 19, 2010, 10:42:57 PM8/19/10
to pon...@googlegroups.com
没错,编个了log4cxx,1.6M
但是还没有尝试其他的,不知道有没有只需要简单加几个文件到可以使用的

Jianfei Wang

unread,
Aug 19, 2010, 10:52:32 PM8/19/10
to pon...@googlegroups.com
http://stackoverflow.com/questions/696321/best-logging-framework-for-native-c

回复中提到的ezlogger,纯头文件实现的,才下下来,还没看。

2010/8/20 Eric Miao <eric....@gmail.com>

没错,编个了log4cxx,1.6M
但是还没有尝试其他的,不知道有没有只需要简单加几个文件到可以使用的


Ken

unread,
Aug 20, 2010, 6:12:20 AM8/20/10
to pon...@googlegroups.com
每个库都有特点,glog 认为这种一次性的泄漏是没有关系的

Windows 下我推荐使用 libjingle 内的 Log, 代码在
http://code.google.com/p/libjingle/source/browse/trunk/talk/base/logging.h

简单实用,当然这也是跨平台的实现。




2010/8/19 frank28 <fra...@gmail.com>

Dbger

unread,
Aug 20, 2010, 9:14:32 AM8/20/10
to pon...@googlegroups.com
一个不怎么美的想法,以windows为例:
  • 新建一个DLL,在DllMain中Process Detach的时候,释放那些全局变量,或者弄个全局对象,在析构函数中作释放
  • 让你们系统中最底层的DLL依赖于它,从而保证这个新建的DLL在启动时是最早load,退出时是最晚unload的
  • 当个DLL unload的时候,应该所有相关的log操作都已经结束了,哪怕是静态对象的析构函数中的那些


Blog: http://www.cnblogs.com/baiyanhuang/
Douban:http://www.douban.com/people/baiyanhuang/


2010/8/20 Jianfei Wang <fra...@gmail.com>

Yongwei Wu

unread,
Aug 22, 2010, 1:12:04 AM8/22/10
to pon...@googlegroups.com
C++里是有技巧可以保证析构顺序的。记得是Bjarne在书里描述过的,但一时查
不到。

我自己的代码里有这个例子:

http://nvwa.cvs.sourceforge.net/viewvc/nvwa/nvwa/debug_new.h?view=markup
http://nvwa.cvs.sourceforge.net/viewvc/nvwa/nvwa/debug_new.cpp?view=markup

__debug_new_counter类的唯一用途就是记录还有几个文件目前仍然在使用
debug_new,并在没有时调用内存泄漏检查函数。我也使用过这个技巧处理全局
对象的析构。

2010/8/18 jiang yu <yu.jia...@gmail.com>:


> 我来解释下为什么他没有delete
> 因为有可能一个类在析构的时候做log
> end::~end()
> {
> log << "end";
> ]
> 而这个end类又可能是全局的或者静态的,无法保证他先于log析构,所以只能不delete。
> 在 2010年8月19日 上午11:06,frank28 <fra...@gmail.com>写道:
>>
>> = 关于google-glog =
>> 一直想加个log库,本来glog关注满久的了,也见到之前Shuo Chen的推荐,打算就认它了,结果用了才知道世界没那么完美的。
>>
>> 编译以及加上gflags支持,这些都搞定了。
>> 最大的问题是有内存泄漏。
>> 我们项目是严格要求vs退出时不允许报内存泄漏的,粗略看了下glog的代码,结果发现人家new了不delete的地方比比皆是啊。虽然说人家好像要
>> 么是static的,要么是都加了空判断保证只会new一次,但最后却没个整体清理的地方,这个总不是啥好习惯吧?Linux下这些就不重要嘛?还是真

>> 的就是小细节?总之这一点,估计glog九成九要毙掉了......


>>
>> = boost::log =
>> 虽然最近才正式批准进了boost的样子,但看了review结果中的critical issues(http://
>> lists.boost.org/boost-announce/2010/03/0256.php),觉得还是算了。况且在项目里推boost实在是

>> 吃力不讨好......
>>
>> 那么各位还有其它c++的log库的推荐呢?

Julian Qian

unread,
Aug 23, 2010, 1:17:45 AM8/23/10
to TopLanguage
可以考虑log4cxx,现在是apache的一个项目,功能跟log4j类似,很好用。
Reply all
Reply to author
Forward
0 new messages