【问题标题】:Logging Java web applications?记录 Java Web 应用程序?
【发布时间】:2010-10-11 12:13:24
【问题描述】:

我计划在我目前正在开发的 Web 应用程序中实现登录,但我正在努力解决一些细节问题。记录 Java Web 应用程序的最佳方法是什么?

具体;

  • .war 包文件中的配置文件在哪里?
  • 人们在哪里登录,相对路径或绝对路径平面文件,还是数据库?
  • Lo​​g4J 日志记录是直接自动进入应用程序服务器日志文件还是您必须进行设置?在这种情况下,我使用的是 Tomcat,但我经常使用 Jrun。
  • 关于 Web 应用程序日志记录我应该注意的任何其他问题?

目前我正在使用 Log4J,但我认为最佳实践将普遍适用于所有日志记录实现。

编辑:
对顶部问题的补充。

  • 你在哪里初始化日志 配置?

在传统应用程序中,我在入口点执行此操作;

DOMConfigurator.configureAndWatch("log4j.xml");

Web 应用程序等价物是什么?

【问题讨论】:

  • 决定最终接受这个答案。并不是只有一个答案,但 cherouvim 的答案是最有帮助的。

标签: java web-applications logging log4j


【解决方案1】:

我建议您使用SLF4J。这是一个简单的日志外观,它支持大多数流行的日志系统(Log4jcommons-loggingJava Logging APILogback em>)。 使用它,您将能够通过简单的 CLASSPATH 更新将您的下划线日志系统替换为任何其他系统

SLF4J 的另一个好处是parameterized calls,它减少了丑陋的日志记录代码。

实际上,他们建议使用 SLF4JLogbackLogbackLog4J 的继承者。而且是同一个作者设计的。

【讨论】:

    【解决方案2】:

    .war包文件中的配置文件在哪里? 类路径的根目录。

    人们在哪里登录,相对路径或绝对路径平面文件,还是数据库? 取决于需要。使用相对路径总是更好。如果您实现另一个应用程序,该应用程序将从数据库中获取日志并使用电子邮件/短信发送它们,那么数据库是很好的

    Log4J 日志记录是直接自动进入应用程序服务器日志文件还是您必须设置?在这种情况下,我使用的是 Tomcat,但我经常使用 Jrun。 如果您使用控制台附加程序,是的,它将记录在您的 servlet 容器日志文件中。

    关于 Web 应用程序日志记录我应该注意的任何其他问题? 如果您从不同的线程进行日志记录,请使用logback,它是线程安全的,并且会公开参数化的日志消息。

    【讨论】:

      【解决方案3】:

      记录到数据库会增加另一个故障点。我们遇到了这样一种情况,即 prod 服务器登录到数据库,并且有人在该数据库上运行了一个昂贵的查询,这大大降低了它的速度,以至于 prod 服务器变得非常非常慢。如果空间不足,记录到文件可能会导致问题,但似乎不太可能减慢整个应用程序的速度。

      【讨论】:

        【解决方案4】:

        我将我的配置放在默认包上:src/

        并使用 ${catalina.home} 系统属性登录到文件:

        log4j.appender.???.file=${catalina.home}/logs/system.log

        【讨论】:

        • 啊,我使用的是 windows 并且 catalina.home 似乎没有在我安装了 tomcat 的任何机器上设置为环境变量。是通过tomcat内部的某种机制解决的还是我只需要手动设置它? catalina.home 还指向哪里,根 tomcat 文件夹?
        • 对不起,我的错,不是环境变量,而是tomcat启动时设置的系统属性。
        • 继续手动设置。实际上有两种方法可以在 Windows 上安装 tomcat。一个通过标准的 Windows 安装(并将 tomcat 作为 Windows 服务安装),另一个只是一个普通的旧 zip 文件。我认为这两种方法都不会为您更新任何环境变量。
        • @cherouvim,啊,是的,我记得有一些奇怪的地方。您能帮我一个忙并更新您的答案以更正对环境变量的引用。
        • @nemo:当然。现在我正试图看看如何在 SO 中进行过度罢工
        【解决方案5】:

        最好将配置文件放置在管理员可以修改它而无需重新构建您的 Web 应用程序的地方(例如,这样他们就可以打开详细的日志记录而不用在半夜叫醒您)。

        不幸的是,没有“官方”方法可以从网络应用程序中找到外部化资源(如果我错了,请纠正我)。我见过的最常见的做法是查看类路径中的目录。

        【讨论】:

        • 是的,我在应用程序配置文件中遇到了同样的问题。这是战争包的诅咒。再说一次,精明的管理员应该能够使用 7-Zip 之类的东西打开包并编辑配置文件。遗憾的是,我们没有雇用这样的人。
        • 是的,即使管理员足够精明地破解 WAR 文件,他们的自定义设置也会在下一个版本部署时被覆盖。
        【解决方案6】:

        我建议通过 slf4j 调用日志 API (log4j)。即使您使用 log4j,Web 容器或依赖模块也可能使用不同的日志 API,例如 Java.util.logging 或 Jakarta commons logging。 Slf4j 提供了将它们重定向到 slf4j API 的桥接模块。因此,在这种情况下,所有日志消息都由 log4j 写入。

        【讨论】:

          【解决方案7】:

          优秀论文How to Do Application Logging Right 有很多陷阱。

          我相信此页面上的其他人已经回答了您的其他问题。

          我也推荐你使用 SLF4J。

          最后一件事:拥有speakable representations of objects 可以节省一些时间。

          【讨论】:

            【解决方案8】:
            • 将 log4j 放入容器(服务器)并为每个应用程序创建适当的附加程序
            • 相对于服务器路径,但这取决于您的需要
            • 我们使用附加程序记录到不同的文件,这取决于您的需要,例如一个用于休眠信息/统计的文件,一个仅用于应用程序,等等。
            • 不要登录太多,它会减慢应用程序的速度

            【讨论】:

            • 将 Log4j 配置放入容器是一个有趣的想法。但是在我的特定工作环境中,我可以看到创建部署问题。
            • 这种方法可以进一步解耦开发和生产日志记录需求,开发人员有自己的服务器实例,可以记录他想要的内容,而不会出现“意外”签入和部署开发 log4j 的问题生产机器
            • @Michael Lange:您可以通过为开发、暂存和生产设置不同的配置工件来做同样的事情。我更喜欢在我的应用程序中使用 log4j。将它放在容器上会使超过 1 个应用程序无法控制日志记录配置。
            • 取决于架构、流程模型和服务器人员必须掌握的大量应用程序,我们将开发人员和维护人员(以及更多)严格分开
            【解决方案9】:

            我个人将 log4j.properties 放在 WEB-INF 目录中,并使用带有以下代码的 init servlet:

            public class InitServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
            
            private static final String LOG4J_FILE = "WEB-INF/log4j.properties";
            
            public InitServlet() {
                super();
            }
            
            @Override
            public void init() throws ServletException {
                super.init();
                PropertyConfigurator.configure(getServletContext().getRealPath(LOG4J_FILE));
                LogFactory.getLog(InitServlet.class).info("LOG 4J configured");
            }
            

            }

            【讨论】:

              【解决方案10】:
              • .war 包文件中的配置文件在哪里?

              在类路径的根目录但是...不要把配置文件放在war包里。如果您更改日志记录配置,您不想重新打包和重新部署应用程序,是吗?更好的做法是将配置文件放在战争之外的类路径中。

              • 人们在哪里登录,相对路径或绝对路径平面文件,还是数据库?

              我通常将日志记录到独立分区上的文件系统(日志文件可以增长得非常快,如果它们变得太大,绝不应该阻塞应用程序或操作系统)。我大部分时间使用基于以下模型的绝对路径:/var/projects////logs/.log 其中 是项目名称, 可以是 Apache、Tomcat、Weblogic、..., 是集群的名称, 是集群内实例的名称。记录到文件系统比在数据库中要快。缺点是如果您使用多个实例和物理机,则日志不是集中式的。但是合并可以很容易地用一个脚本来完成。

              • Lo​​g4J 日志记录是直接自动进入应用程序服务器日志文件还是您必须进行设置?在这种情况下,我使用的是 Tomcat,但我经常使用 Jrun。

              应用程序服务器日志是应用程序服务器日志,而不是应用程序日志。不要给他们写信,而是设置一个记录器工具(例如 log4j)并写入应用程序日志(了解专用)。

              • 关于 Web 应用程序日志记录,我还应该注意哪些其他问题?

              如果你使用 log4j,别忘了在 log 之前使用 isDebugEnabled():

              if(logger.isDebugEnabled()) {
                logger.debug("Bla Bla Bla");
              }
              

              【讨论】:

                【解决方案11】:
                • .war 包文件中的配置文件在哪里?

                通常,我不会在应用程序中放置任何日志记录配置,而是将其留给应用服务器管理员来配置服务器范围的日志记录。在极少数情况下,我希望使用 webapp 部署 log4j 配置,WEB-INF 是通常的路径。

                • 人们在哪里登录,相对路径或绝对路径平面文件,还是数据库?

                同样,取决于应用服务器设置。应用服务器和每天轮换的一个常见日志文件是通常的设置。如果有任何特定于应用程序的需求,管理员可以为应用程序配置单独的日志文件(按包/类名区分)。

                • Lo​​g4J 日志记录是直接自动进入应用程序服务器日志文件还是您必须进行设置?在这种情况下,我使用的是 Tomcat,但我经常使用 Jrun。

                见上文。对于用于开发目的的 tomcat,我只需查找其日志记录 (log4j) 配置并在其中添加特定于应用程序的配置。

                • 对于 Web 应用程序日志记录,我还应该注意哪些其他问题? 表现。上线后,将日志级别限制在最低限度(即 WARN 或 ERROR)。采用 if (log.isDebugEnabled()) { log.debug("..."); } 和代码中的类似结构。

                【讨论】:

                  【解决方案12】:

                  请注意,如果您只需要一点日志记录,则 servlet 标准规定您可以获取 ServletContext 并在那里使用日志方法。这是 System.out.println 的通用 servlet 等价物。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2018-09-09
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多