【问题标题】:log4j-Logger not writing to log-filelog4j-Logger 不写入日志文件
【发布时间】:2017-06-22 16:20:34
【问题描述】:

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

在“Source Packages”文件夹中,我创建了一个名为“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 文件夹内的日志文件夹内):

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

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

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

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

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

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

【问题讨论】:

  • 您是否有任何理由以这种(相当困难的)方式初始化 log4j 而不是类路径上的 log4j.xml?
  • 我认为您不需要 servlet 来为您执行此操作。正如@jingx 建议的那样,您可以在类路径上初始化 log4j。看看this doc
  • @Ishnark 按照链接下方指南中的要求,我下载了 log4j。我应该把它放到“WEB-INF/classes”文件夹中。因此,我在“WEB-INF”中创建了一个“类”文件夹......但是,我无法将 jar 文件添加到该文件夹​​(当我右键单击类文件夹时,没有给出这样的选项)跨度>
  • 哦,对不起,我以为你想记录你的 tomcat。请看我的回答

标签: java logging log4j


【解决方案1】:

工作方法(可行,但不是最好的)

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

    • log4j.jarlog4j.properties 文件必须由同一个类加载器加载,因此 两个 文件必须位于 lib 目录中,类加载器才能将其加载。
  • 或者,如果您想为项目中的所有应用使用相同的日志配置,您可以将这两个文件移至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");

【讨论】:

  • 问题是:我无法将 jar 文件添加到 WEB-IN 文件夹内的 lib 文件夹中……我可以将它们添加到库文件夹中……但是如果我必须将它们添加到 lib 文件夹(我应您的要求创建的),它不起作用
  • 您不能通过 Finder 放入文件(假设这是 Mac)?
  • 我将文件放到 lib 文件夹中...然后我清理构建了项目... jar 文件未显示在 lib 文件夹内的 netbeans 中(尽管它们实际上在此文件夹中) ...当我运行我的应用程序时,记录器再次没有向日志文件写入任何内容
  • 嗯,我对 NetBeans 不太熟悉,但我找到了 this。尝试将 jar 也添加到您的项目类路径中,也许它会出现?
  • 链接说:“对于netbeans:在项目属性窗口中单击左侧面板中的库。在右侧面板中将其添加到编译类路径”我没有“库”文件夹,只有“图书馆”
猜你喜欢
  • 2015-11-06
  • 1970-01-01
  • 1970-01-01
  • 2017-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多