【问题标题】:Where to declare log4j in servlets and filters?在 servlet 和过滤器中在哪里声明 log4j?
【发布时间】:2011-04-07 02:53:17
【问题描述】:

当我尝试使用 log4j 记录进程时,我感到困惑,我不知道将记录器放在哪里。 现在我已经将记录器放在 servlet 中并将其声明为公共静态,以便每个人都可以使用它。我的过滤器也使用记录器。但是我不确定servlet是否被破坏,记录器也会被破坏吗?

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

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

【问题讨论】:

    标签: java servlets log4j servlet-filters


    【解决方案1】:

    为每个班级创建一个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 的日志不会显示。希望对您有所帮助。

    【讨论】:

    • 确实,它与其他“普通”Java 类没有什么不同。每个班级只有一个记录器。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-03
      • 1970-01-01
      • 1970-01-01
      • 2015-08-30
      相关资源
      最近更新 更多