21

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

具体来说;

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

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

编辑:
顶部问题的一个补充。

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

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

DOMConfigurator.configureAndWatch("log4j.xml");

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

4

12 回答 12

11

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

SLF4J的另一个好处是参数化调用,它减少了丑陋的日志记录代码。

实际上,他们建议将SLF4JLogback一起使用。 LogbackLog4J的继承者。它是由同一作者设计的。

于 2009-03-05T18:42:39.673 回答
8

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

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

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

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

于 2009-03-05T13:13:04.987 回答
6

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

于 2009-03-05T15:01:31.203 回答
4

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

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

log4j.appender.???.file=${catalina.home}/logs/system.log
于 2009-03-05T13:07:27.857 回答
2

将配置文件放置在管理员可以在不重新构建您的 Web 应用程序的情况下修改它的地方可能是一个好主意(例如,这样他们就可以打开详细的日志记录而不会在半夜唤醒您)。

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

于 2009-03-05T13:27:50.350 回答
1

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

于 2009-03-05T16:19:09.550 回答
1

优秀的论文How to Do Application Logging Right有很多问题。

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

我还建议您使用 SLF4J。

最后一件事:拥有对象的可朗读表示可以节省一些时间。

于 2012-10-30T23:05:17.473 回答
0
  • 将 log4j 放入容器(服务器)并为每个应用程序创建适当的附加程序
  • 相对于服务器路径,但这取决于您的需要
  • 我们使用记录到不同文件的附加程序,具体取决于您的需要,例如一个用于休眠信息/统计的文件,一个仅用于应用程序等。
  • 不要登录太多,它会减慢应用程序的速度
于 2009-03-05T13:09:25.747 回答
0

我个人将 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");
}

}

于 2009-03-05T13:15:07.073 回答
0
  • .war 包文件中的配置文件在哪里?

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

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

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

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

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

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

如果您使用的是 log4j,请不要忘记在记录之前使用 isDebugEnabled():

if(logger.isDebugEnabled()) {
  logger.debug("Bla Bla Bla");
}
于 2009-03-05T14:27:36.183 回答
0
  • .war 包文件中的配置文件在哪里?

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

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

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

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

往上看。对于用于开发目的的 tomcat,我只需查找它的日志记录 (log4j) 配置并在那里添加特定于应用程序的特定内容。

  • 对于 Web 应用程序日志记录,我应该注意哪些其他问题?表现。上线后,将日志级别限制在最低限度(即 WARN 或 ERROR)。在您的代码中使用 if (log.isDebugEnabled()) { log.debug("..."); }和类似的构造。
于 2009-03-05T14:56:50.340 回答
0

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

于 2009-03-05T18:08:21.363 回答