在servlet和过滤器中声明log4j的位置?

时间:2011-04-07 02:53:18

标签: java servlets log4j servlet-filters

当我尝试使用log4j登录进程时,我很困惑,我不知道将记录器放在何处。 现在我将记录器放在servlet中并将其声明为public static,以便每个人都可以使用它。我的过滤器也使用记录器。但我不确定servlet是否会被破坏,记录器是否也会被破坏?

另一个问题,在我的理解中,过滤器是在servlet之前,当我在servlet中创建记录器时,在最开始,过滤器应该不能使用记录器,但是,因为我让过滤器记录了过程中,没有像“记录器不存在”这样的异常,为什么?

记录器的最佳位置是什么?它应该是静态的,也就是说,多个类可以共享一个记录器?我想将filter和servlet的日志放在一起。

2 个答案:

答案 0 :(得分:2)

为每个班级创建private static final Logger。例如,在servlet类中编写以下行:

private static final Logger logger = Logger.getLogger(YourServletClassName.class);

以及过滤器类中的以下行:

private static final Logger logger = Logger.getLogger(YourFilterClassName.class);

注意在getLogger()方法中作为参数传递的不同值。记录器应为private static,以便同一类的多个实例可以使用它。这样,您可以按类别控制应用程序的输出。例如,如果您只想查看所有实例YourServletClassName的输出(尽管通常只创建一个Servlet类实例,它会被重新用于处理每个请求),您可以在log4j.properties中编写以下行:

log4j.logger.your.package.YourServletClassName=TRACE
log4j.logger.your.package.YourFilterClassName=OFF

这样,来自YourServletClassName的日志将仅显示,YourFilterClassName不会显示任何内容。希望它有所帮助。

答案 1 :(得分:0)

您应该在每个类中定义一个单独的记录器

static org.apache.log4j.Logger logger = Logger.getLogger(MyClass.class);

这样您的日志文件就会清晰排列,您可以在配置文件中使用正确的类别。