log4crc和log4c版本不匹配导致log4c初始化失败

问题描述:

在学习log4c的过程中,参考了http://www.linuxidc.com/Linux/2011-02/32560p2.htm给出的例子。同时在log4c官网下载了最新的1.2.4的源码做build和安装。结果那个例子怎样都跑不出log来。

但是,在另外一台机器上这个例子运行正常。


问题定位:

在排除能想到的各种错误之后,只能去调试log4c的源码了。将例子中先前的log4c动态链接改成静态链接,然后gdb调试。其间发现在例子程序的下面函数中,运行到return 0 时,在两台机器上打印出来的mycat 的值不一样。

int mylog_init()
{
	if (log4c_init() == 1)
	{
		return 1;
	}
	mycat = log4c_category_get(MYLOG_CATEGORY_NAME);
	return 0 ;
}

下图是不能正确输出log的机器上的调试结果。而输出log正确的机器上,调试结果中,cat_priority是700(debug priority),cat_appender不为空。这说明前面的log4c_init()虽然没有返回1,但是还是出错了,因为加载的category值不对!

log4crc和log4c版本不匹配导致log4c初始化失败_第1张图片
在接下来的调试中,发现在log4c 1.2.4 源码的rc.c 的333行,出现root_node=0x0,怀疑出错在这个函数(事实上这样推测是不对的,这里主要和log4c_rc_load()函数返回非0值有关。直觉是错了,但方向还是对的 :-))。于是在该函数每个return 非0的地方加上断点。结果发现,在352行return -1 了。看347行的注释,就大致知道问题可能出在哪儿了: 加载的log4crc文件的版本不正确

log4crc和log4c版本不匹配导致log4c初始化失败_第2张图片

接下来做了几件事情:

1)看运行正确的机器上安装的log4c的版本,以及测试程序加载的log4crc配置文件的版本。结果发现安装的log4c和加载的配置文件log4crc 都是1.2.1的。

2)在运行错误的机器上查看同样的参数。结果这台机器安装的是1.2.4,加载的配置文件却是1.2.1!

log4crc和log4c版本不匹配导致log4c初始化失败_第3张图片

3)在运行错误的机器上,将log4crc的版本改成"1.2.4",运行。OK了!


小结:

1)查这个问题,折腾了好几小时,结果只要改一个字符,“1”变“4”即结了!可见检查问题远比解决问题困难的多。

2)使用log4c一定要注意配置文件log4crc的版本,看它是否和调用的log4c库版本一致!类似的,使用其他库的时候,也可以适当注意版本是否一致的问题。


你可能感兴趣的:(log4crc和log4c版本不匹配导致log4c初始化失败)