4

我们有一个 Spring MVC 应用程序在 RackSpace 上的多个 Tomcat 7 服务器上运行。在每个类中,我们都有类似于以下内容的内容:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
...
protected final transient Logger logger = LoggerFactory.getLogger(this.getClass());

我们获取 MVC 控制器的所有日志记录条目,并且大部分日志记录来自我们的模型类(JavaBeans),但偶尔会出现以下调用:

logger.debug("some logging");

引发 NullPointerException。显然“记录器”是空的,但我没有解释为什么会这样。它是在类声明的顶部初始化的,所以我很困惑。

4

2 回答 2

2

只是一个想法,你确定你记录的类的实例永远不会序列化/反序列化吗?这会导致您的记录器迷路。

而且,如果是这样,为什么不将记录器声明为static?以下是来自 slf4j.org 的一些信息,可以帮助您确定正确的方法:

http://slf4j.org/faq.html#declared_static

如果您将它们声明为静态的,那么一旦它们工作,您就可以相信它们会一直工作(只要您的 JVM 正常工作)。

于 2013-10-14T16:45:52.117 回答
1

尝试用transient一个替换static

然后不要使用this.getClass()butTHE_ACTUAL_CLASS.class作为 getLogger() 方法的参数

于 2013-10-14T16:43:27.767 回答