首页 > 解决方案 > 我使用 FileHandler 创建了一个记录器类来将日志写入文件,但它只是打印到控制台

问题描述

我正在尝试创建一个 java 记录器文件,它将输出写入项目文件夹(NetBeans、MacOS)中的文件。我正在为一个学校项目做这个,所以我不能使用 Log4j。我已经查看了之前关于此主题的问题并尝试实施这些解决方案,但我仍然没有看到任何成功。我是否需要扩展文件路径,或者是否有我遗漏的主要组件?朝着正确方向迈出的任何一步都会有所帮助,谢谢。

我尝试将文件路径从用户文件夹一直延伸到 netbeans 中的单个项目文件夹。我已经查看了很多资源和示例,但是无论我缺少什么元素,我都没有找到。

public class log {
   private final static Logger LOGGER = 
Logger.getLogger(log.class.getName());
   private final static FileHandler handleLog = null;



   public static void start() throws IOException, 
SecurityException{
    FileHandler handleLog = new 
FileHandler("/Users/cassie/NetBeansProjects/GlobalConsulting- 
   userLog.%u.%g.txt", 1024 * 1024, 10, true);
    SimpleFormatter simple = new SimpleFormatter();
    handleLog.setFormatter(simple);
    LOGGER.addHandler(handleLog);
    LOGGER.setLevel(Level.INFO);

   }

   public static void main(String[] args) throws IOException, 
SecurityException{
       start();
       LOGGER.info("------------------START--------------------");

   }
}

当我在另一个文件中调用它时,我就是这样做的。

LOGGER.log(Level.INFO, "{0} logged in", currentUser.getUsername());

我希望当程序运行时,输出(用户登录)将打印到项目文件夹中的日志文件,并在重写之前更新 10 次。我没有收到任何错误消息,但所有输出都直接进入控制台。

标签: javaloggingutility

解决方案


我没有收到任何错误消息,但所有输出都直接进入控制台。

在代码中使用printConfig来确定记录器树的状态。为了查看日志文件的输出,您需要以下内容:

  1. 文件处理程序无一例外地创建。从您的问题来看,这似乎是有效的。
  2. 您应该能够在程序运行时看到日志文件至少已创建(并且为空)。默认情况下,如果文件处理程序无法解析路径,它将抛出错误或在用户的主目录中创建一个名为java0.log. 如果您指定文件路径并且在运行程序之前目录不存在,通常会发生这种情况。
  3. 文件处理程序必须附加到可记录节点或父记录器的记录器树。如果从您的程序的角度来看,文件处理程序附加到子记录器,它将不会看到日志消息。日志记录沿记录器树向上传播到父处理程序。通常 ConsoleHandler 安装在根记录器上,因此它会看到与安装在根的子级上的文件处理程序不同的所有内容。
  4. 文件处理程序必须具有正确的级别。用于Level.ALL处理程序。
  5. 文件处理程序不应安装过滤器 ( null)。JDK没有附带任何东西,所以这应该不是问题。
  6. 必须设置记录器级别,以便您实际为处理程序生成日志记录。
  7. 另一个功能删除或重置正在删除您的配置的日志管理器。SecurityManager 可以确定这一点,但这很可能不是原因,因为您不使用任何 3rd 方库。

回答这些问题,您应该能够确定为什么看不到日志文件。


推荐阅读