2012年7月26日

一个log4j的配置问题

为了查看Spring中注册RMI的问题,继承了org.springframework.remoting.rmi.RmiRegistryFactoryBean,同时想把这个类的log级别调成DEBUG.

修改后的配置如下

bean的配置:

<bean id="registry" class="xxx.MyRmiRegistryFactoryBean">
    <property name="port" value="12345"/>
</bean>

log4j的配置:

log4j.logger.org.springframework.remoting.rmi.RmiRegistryFactoryBean=debug

应该说没啥特别的,可是没有任何输出.

确定配置的写法没有问题后,只能在common-logging的LogFactory.getLog方法被调用时打印出类名.
结果打印了xxx.MyRmiRegistryFactoryBean.

此时再回过头去看RmiRegistryFactoryBean里的logger定义,坑爹啊,居然是个实例变量:

protected final Log logger = LogFactory.getLog(getClass());

平时定义logger的时候一般都是习惯定义成static的,已经形成了思维定势...之前看了好久RmiRegistryFactoryBean的代码,居然都没发现这里logger是实例变量.

因为现在实例的是MyRmiRegistryFactoryBean,getClass()返回的自然就是xxx.MyRmiRegistryFactoryBean

因此只要修改log4j的配置如下就可以了:

log4j.logger.xxx.MyRmiRegistryFactoryBean=debug

恩,我一直以为是log4j的问题, 调试了半天log4j的代码,要是一开始就调试spring的代码,应该一下子就发现问题了.