Java log4j记录器未写入日志文件

Java log4j记录器未写入日志文件,java,logging,log4j,Java,Logging,Log4j,对于我的netbeans java web应用程序,我希望使用记录器进行调试。 为此,我在我的库中包括了log4j-1.2.16.jar: 在“sourcepackages”文件夹中,我创建了一个名为“Logging”的文件夹。在这个文件夹中,我放置了以下servlet(在应用程序启动时初始化记录器): 包记录 import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletExcepti

对于我的netbeans java web应用程序,我希望使用记录器进行调试。 为此,我在我的库中包括了log4j-1.2.16.jar:

在“sourcepackages”文件夹中,我创建了一个名为“Logging”的文件夹。在这个文件夹中,我放置了以下servlet(在应用程序启动时初始化记录器):

包记录

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Appender;
import org.apache.log4j.FileAppender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.RollingFileAppender;

public class InitLog4j extends HttpServlet {

   public void init() {
        String initPath = getInitParameter("logPath");
        String logPath = "/WEB-INF/logs/error.log";
        if (initPath != null) logPath = initPath;
        FileAppender appender = getAppender(logPath);
        if (appender == null) return;
        initLogger(null, appender, Level.INFO);
  }

  private FileAppender getAppender(String fileName) {
    RollingFileAppender appender = null;
    try {
      appender = new RollingFileAppender(
          new PatternLayout("%-5p %c %t%n%29d - %m%n"),
          getServletContext().getRealPath(fileName),
          true);
      appender.setMaxBackupIndex(5);
      appender.setMaxFileSize("1MB");
    } catch (IOException ex) {
      System.out.println(
          "Could not create appender for " 
          + fileName + ":"
          + ex.getMessage());
    }
    return appender;
  }

  private void initLogger(String name, 
                          FileAppender appender, 
                          Level level) 
  {
    Logger logger;
    if (name == null) {
      logger = Logger.getRootLogger();
    } else {
      logger = Logger.getLogger(name);
    }
    logger.setLevel(level);
    logger.addAppender(appender);
    logger.info("Starting " + logger.getName());
  }


}
在我的web.xnl文件中,我包括以下几行:

最后,我创建了一个日志文件(在WEB-INF文件夹的日志文件夹中):

然后,我在“controller”类中创建了一个记录器。此记录器应将文本消息写入文件error.log:

但是,当我运行应用程序时(它创建了一个http请求,正如您从上图中看到的那样,应该触发记录器),没有任何内容写入error.log文件。它和以前一样空

为什么我的记录器没有写入日志文件

******************************更新*************************************

无法将jar文件添加到lib文件夹:

只能将它们添加到Libraries文件夹:

工作方法(它有效,但不是最好的)

  • 如果您只想记录这个应用程序,那么将
    log4j.jar
    log4j.properties
    放入
    WEB-INF/lib
    中。您不能将
    .jar
    文件放入
    WEB-INF/classes
    中。这是为
    .class
    文件保留的

    • log4j.jar
      log4j.properties
      文件必须由同一个类加载器加载,因此这两个文件都必须位于lib目录中,类加载器才能提取它
  • 或者,如果希望对项目中的所有应用程序使用相同的日志配置,可以将这两个文件移到
    Tomcat/lib
    目录

更好的方法

将非jar文件放在lib目录中不是一个好做法。
log4j.properties
是一个配置文件。我们可以采取以下措施:

  • 和前面一样,将
    log4j.jar
    保存在'WEB-INF/lib'目录中
  • 然后将
    log4j.properties
    放在conf目录中(“Tomcat/conf”或“WEB-INF/conf”)
  • 然后,在每个使用记录器的类中,您可以这样做:classthattusesLogger.class.getClassLoader().getResourceAsStream(“conf/log4j.properties”)
    有什么原因让你用这种(相当困难的)方式初始化log4j而不是在类路径上初始化log4j.xml吗?我认为你不需要servlet来完成这项工作。正如@jingx所建议的,您可以在类路径上初始化log4j。按照指南中的要求查看一下@Ishnark,我下载了log4j。我应该把它放在“WEB-INF/classes”文件夹中。因此,我在“WEB-INF”中创建了一个“classes”文件夹。。。但是,我无法将jar文件添加到此文件夹(当我右键单击classes文件夹时,没有给出这样的选项)哦,很抱歉,我以为您想登录tomcat。请看我的回答:我不能将jar文件添加到WEB IN文件夹中的lib文件夹中。。。我可以将它们添加到Libraries文件夹中。。。但是,如果我必须将它们添加到lib文件夹(我根据您的请求创建的),它将不起作用您不能通过Finder将文件放入(假设这是mac)?我将文件放入lib文件夹。。。然后我完成了这个项目。。。jar文件不会显示在lib文件夹内的netbeans中(尽管它们实际上在这个文件夹内)。。。当我运行我的应用程序时,记录器也不会向日志文件写入任何内容。嗯,我对NetBeans不太熟悉,但我发现。尝试将jar添加到您的项目类路径,也许它会显示出来?该链接说:“对于netbeans:在项目属性窗口中,单击左面板中的库。在右面板中,将其添加到编译类路径”我没有“库”文件夹,只有“库”