记录Java web应用程序?

记录Java web应用程序?,java,web-applications,logging,log4j,Java,Web Applications,Logging,Log4j,我计划实现登录到我目前正在开发的一个web应用程序,但我正在为一些细节而挣扎。记录Java web应用程序的最佳方式是什么 具体而言 配置文件在.war包文件中的位置 人们登录到哪里,相对或绝对路径平面文件,或数据库 Log4J日志记录是自动直接进入应用服务器日志文件,还是必须进行设置?在本例中,我使用的是Tomcat,但我经常使用Jrun 对于web应用程序日志记录,我还应该注意哪些其他问题 目前我正在使用Log4J,但我认为最佳实践将普遍适用于所有日志实现 编辑: 除了上面的问题之外,还

我计划实现登录到我目前正在开发的一个web应用程序,但我正在为一些细节而挣扎。记录Java web应用程序的最佳方式是什么

具体而言

  • 配置文件在.war包文件中的位置
  • 人们登录到哪里,相对或绝对路径平面文件,或数据库
  • Log4J日志记录是自动直接进入应用服务器日志文件,还是必须进行设置?在本例中,我使用的是Tomcat,但我经常使用Jrun
  • 对于web应用程序日志记录,我还应该注意哪些其他问题
目前我正在使用Log4J,但我认为最佳实践将普遍适用于所有日志实现

编辑:
除了上面的问题之外,还有一个问题

  • 你在哪里初始化日志 配置
在一个传统的应用程序中,我在入口点做这件事

DOMConfigurator.configureAndWatch("log4j.xml");

web应用程序的等价物是什么?

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

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

log4j.appender.???.file=${catalina.home}/logs/system.log log4j.appender.???.file=${catalina.home}/logs/system.log
  • 将log4j放入容器(服务器)中,并为每个应用程序创建适当的appender
  • 相对于服务器路径,但这取决于您的需要
  • 根据您的需要,我们使用Appender来记录不同的文件,例如一个文件用于hibernate信息/统计,一个文件仅用于应用程序,等等
  • 不要登录太多,这会减慢应用程序的速度

配置文件在.war包文件中的位置? 类路径的根

人们登录到哪里、相对或绝对路径平面文件或数据库? 视需要而定。最好使用相对路径。如果您实现了另一个应用程序,该应用程序将从数据库中获取日志并使用电子邮件/短信发送日志,那么数据库就很好了

Log4J日志记录是自动直接进入应用服务器日志文件,还是必须进行设置?在本例中,我使用的是Tomcat,但我经常使用Jrun。 如果您使用ConsoleAppender,是的,它将被记录在servlet容器日志文件中

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

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

将配置文件放置在一个管理员可以修改它而不需要重建Web应用程序的地方(例如,这样他们可以在不在半夜唤醒你的情况下启动详细的日志记录)是一个好主意。p> 不幸的是,没有“官方”的方法来定位web应用程序中的外部化资源(如果我错了,请纠正我)。我见过的最常用的方法是查看类路径中的目录。

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

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

  • Log4J日志记录是自动直接进入应用服务器日志文件,还是必须进行设置?在本例中,我使用的是Tomcat,但我经常使用Jrun
应用程序服务器日志是应用程序服务器日志,而不是应用程序日志。不要向它们写入数据,而是设置一个日志记录工具(例如log4j)并写入应用程序日志(了解专用日志)

  • 对于web应用程序日志记录,我还应该注意哪些其他问题
如果您使用的是log4j,请不要忘记在记录之前使用isDebugEnabled()

if(logger.isDebugEnabled()) {
  logger.debug("Bla Bla Bla");
}
  • 配置文件在.war包文件中的位置
通常,我不会将任何日志记录配置放入应用程序中,而是将其留给appserver管理员来配置服务器范围的日志记录。在极少数情况下,我希望log4j配置与webapp一起部署,WEB-INF是通常的路径

  • 人们登录到哪里,相对或绝对路径平面文件,或数据库
同样,这取决于appserver设置。通常的设置是appserver的一个常见日志文件,每天轮换一次。如果有任何特定于应用程序的需求,管理员可以为应用程序配置单独的日志文件(以包/类名区分)

  • Log4J日志记录是自动直接进入应用服务器日志文件,还是必须进行设置?在本例中,我使用的是Tomcat,但我经常使用Jrun
见上文。对于用于开发目的的tomcat,我只需要查看它的日志(log4j)配置,并在那里添加特定于应用程序的配置

  • 对于web应用程序日志记录,我还应该注意哪些其他问题? 演出一旦上线,将日志级别限制在最低限度(即警告或错误)。使用
    if(log.isDebugEna