【问题标题】:Java Logger with Servlets带有 Servlet 的 Java 记录器
【发布时间】:2010-04-09 18:33:58
【问题描述】:

我正在使用一个包装类 A 来初始化 java.util.logger

static class A {

    public static Logger logger;

    public static void init(){

    logger = Logger.getLogger("test");

}

现在,在我的程序中,我调用 A.init(),然后调用 logger.log("Message+uniqid")。 但最近我转向了 HTTP servlet,但遇到了问题。

基本上,如果一个应用程序已经在运行并且记录器正在记录...并且其他人再次运行该应用程序,则来自前一个实例的记录器将停止并开始记录第二个实例。任何人都可以解决我应该如何解决这个静态变量问题吗?

我可以将记录器传递给所有构造函数类,但这真的很乏味。任何更好的解决方案将不胜感激..

【问题讨论】:

  • 没有完全阅读你的问题,但我可以推荐你 log4j。

标签: java logging servlets


【解决方案1】:

您不需要多次初始化记录器。

实际上,您甚至不需要手动执行此操作,因为您可以创建一个带有配置信息的属性文件并将其放置到特定目录中,该文件将部署到应用程序中的WEB-INF/classes 文件夹服务器。

在配置文件(properties-file)中你可以定义不同的写日志的方式。那么当你想从某个 servlet 写日志时,例如UserCounterServlet,你应该这样做:

private static final Logger logger = Logger.getLogger (UserCounterServlet.class);
...
logger.info("some info");

【讨论】:

  • 但我希望将日志写入一个文件...所以,我必须一直添加文件处理程序...
  • 您的记录器配置文件位于 WEB-INF/classes/log4j.xml 中。该文件告诉 log4j 你想在哪个文件中记录你的日志。另外,我认为getLogger(UserCounterServlet.class); 会更好一些,因为如果你打错了,你的 IDE 会通知你。
  • @John:关于 UserCounterServlet.class - 你是对的,肯定会更正。
【解决方案2】:

是的,永远不要在 web 应用程序上使用静态,而 user177883 说使用 log4j 这是一个很好的日志记录解决方案,所以为什么要从头开始编写它

【讨论】:

    【解决方案3】:

    如果您想在 servlet 中实现真正好的日志记录解决方案,请不要使用静态记录器(即使您知道一些著名的基于 servlet 的项目使用这种日志记录方式)。使用考虑到 Web 应用程序开发的正确日志记录解决方案(例如 LogBack - log4j 的推进等)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-19
      • 1970-01-01
      • 2015-09-24
      • 1970-01-01
      • 2015-09-24
      • 1970-01-01
      • 2012-08-23
      • 1970-01-01
      相关资源
      最近更新 更多