log4j-Logger没有写入日志文件

时间:2017-06-22 16:20:34

标签: java logging log4j

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

enter image description here

在“源包”文件夹中,我创建了一个名为“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文件中,我包括以下几行:

enter image description here

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

enter image description here

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

enter image description here

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

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

********* UPDATE **************** *********************

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

enter image description here

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

enter image description here

1 个答案:

答案 0 :(得分:0)

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

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

    • log4j.jarlog4j.properties文件必须由同一个类加载器加载,因此两个文件必须位于lib目录中,才能让类加载器接收它。 / LI>
  • 或者,如果要对项目中的所有应用程序使用相同的日志配置,可以将这两个文件转移到Tomcat/lib目录。

更好的方法

将非jar文件放在lib目录中不是一个好习惯。 log4j.properties是配置文件。我们可以改为:

  1. 正如我们之前所做的那样,将log4j.jar保留在' WEB-INF / lib'目录。
  2. 然后将log4j.properties放入conf目录(Tomcat / conf'或' WEB-INF / conf')。
  3. 然后,在每个使用记录器的类中,您可以这样做:ClassThatUsesLogger.class.getClassLoader()。getResourceAsStream(" conf / log4j.properties");