【问题标题】:Java Logging - where is my log file?Java Logging - 我的日志文件在哪里?
【发布时间】:2012-03-16 12:14:45
【问题描述】:

我无法找到我的日志文件。

我在 Windows XP 上的 Eclipse 3.7.1 中使用 Java 日志记录 - java.util.logging。我的logging.properties 文件的相关行是:

handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler
.level=INFO
java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter

据我所知,在我执行这两行之后:

Logger logger = Logger.getLogger("test"); 
logger.logp(Level.INFO, "myClass", "myMethod", "Alcatraz"); 

我的日志文件应该在C:\Documents and Settings\[My Windows ID]\javaX.log 中,其中X 是一个整数。

我在该目录中有 5 个不同的 java.log 文件,从 java0.logjava4.log,但它们都没有包含我的日志记录,甚至没有包含今天日期的记录。我做了一些谷歌搜索,发现Tracing and Logging,这意味着我的日志应该在不同的位置,c:\Documents and Settings\[My Windows ID]\Application Data\Sun\Java\Deployment\log。那里有一个文件,名为plugin5581819941091650582.log,但它基本上是空的:

<?xml version="1.0" encoding="windows-1252" standalone="no"?>
<!DOCTYPE log SYSTEM "logger.dtd">
<log>
</log>

它的创建日期是上周。 (我不确定是什么进程创建的;我当然没有明确创建它。)

那么我的日志文件在哪里呢?我想不出还有什么地方可以看。

另外,有人知道logging.properties 的更改何时生效吗?如果我更改了日志级别或FileHandler.pattern,在我的程序看到更改之前会发生什么?仅仅保存logging.properties 中的更改显然是不够的。我需要重新启动 Eclipse 吗?还是重启电脑?只是好奇。这对我来说并不像找出我的日志文件实际在哪里那么重要。

【问题讨论】:

  • 如果您想更好地控制您的日志,我可以建议您引入另一个名为 Logback 的库吗?或者你可以查看 log4j。

标签: java java.util.logging


【解决方案1】:

.log 文件位于您的 \workspace\.metadata 文件夹中。我正在使用 Eclipse 4.2。

【讨论】:

    【解决方案2】:
    1. Debug the your variable or logger.getHandlers(): just for the instances of FileHandler, and look for its private field: files
    2. 确保您的记录器级别包括您的日志。
    3. 确保您的处理程序级别包括您的日志。
    4. 它将被发送到您的主目录。如果您的操作系统中没有该目录,例如windows 95/98/ME,则该文件应保存到默认路径,例如C:\Windows\
    5. 反射,同技巧1

      Field[] handlerFiles = handler.getClass().getDeclaredFields();
      AccessibleObject.setAccessible(handlerFiles, true);
      
      for (Field field : handlerFiles) {
          if (field.getName().equals("files")) {
              File[] files = (File[]) field.get(handler);
              System.out.println(Arrays.toString(files));
          }
      }
      
    6. 日志管理器会在JVM启动时初始化,在main方法之前完成。您也可以在 main 方法中使用System.setProperty("java.util.logging.config.file", file) 重新初始化它,这将调用LogManager.readConfiguration()

    【讨论】:

      【解决方案3】:

      可以通过 logging.properties 文件控制日志文件的位置。它可以作为JVM参数传递:java -Djava.util.logging.config.file=/scratch/user/config/logging.properties

      详情: https://docs.oracle.com/cd/E23549_01/doc.1111/e14568/handler.htm

      配置文件处理程序

      要将日志发送到文件,请将 FileHandler 添加到 logging.properties 文件中的 handlers 属性中。这将启用全局文件日志记录。

      handlers= java.util.logging.FileHandler
      

      通过设置以下属性来配置处理程序:

      java.util.logging.FileHandler.pattern=<home directory>/logs/oaam.log
      java.util.logging.FileHandler.limit=50000
      java.util.logging.FileHandler.count=1
      java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter
      

      java.util.logging.FileHandler.pattern 指定输出文件的位置和模式。默认设置是您的主目录。

      java.util.logging.FileHandler.limit 以字节为单位指定记录器写入任何一个文件的最大数量。

      java.util.logging.FileHandler.count 指定循环通过多少个输出文件。

      java.util.logging.FileHandler.formatter 指定文件处理程序类用于格式化日志消息的 java.util.logging 格式化程序类。 SimpleFormatter 编写简短的“人类可读”日志记录摘要。

      指示java使用这个配置文件而不是$JDK_HOME/jre/lib/logging.properties:

      java -Djava.util.logging.config.file=/scratch/user/config/logging.properties
      

      【讨论】:

      • -Djava.util.logging.config.file= 不会导致将日志放入当前目录。你有更多关于 CL 方法的信息吗?不允许相对路径吗?
      【解决方案4】:

      似乎默认位置已更改。要查找您的日志文件,请使用您的应用程序打开 Java 控制台。在那里按“s”。这会打印出系统和部署属性,您可以在其中找到类似的内容:

      deployment.user.logdir = C:\Users\username\AppData\LocalLow\Sun\Java\Deployment\log
      

      在那里你会找到你的日志文件。

      【讨论】:

        【解决方案5】:

        提问者遇到问题的根本原因是他的 logging.properties 文件没有被读取。
        java.util.logging.config.file 中指定的文件不是从类路径中读取的。相反,它是从相对于当前目录的文件系统中读取的。
        例如,运行以下命令java -Djava.util.logging.config.file=smclient-logging.properties SMMain 将从当前目录中读取smclient-logging.properties。一旦读取了正确的 java.util.logging.config.file,就会按照文件中的说明生成日志。

        【讨论】:

          【解决方案6】:

          如果它为空,那么文件路径将是您的 Eclipse 主目录。您的 logging.properties 文件没有被系统抓取,因此将属性文件指向完整路径,如下所示,然后您的日志文件将直接在您喜欢的位置生成。 -Djava.util.logging.config.file=D:\keplereclipse\keplerws\NFCInvoicingProject\WebContent\WEB-INF\logging.properties

          【讨论】:

            【解决方案7】:

            您的logging.properties 文件位于何处?它应该在类路径的根目录中可用。作为健全性检查,以下代码打印了什么?

            System.out.println(getClass().getClassLoader().getResource("logging.properties"));
            

            如果代码在 static 上下文中,请使用

            System.out.println(ClassName.class.getClassLoader().getResource("logging.properties"));
            

            【讨论】:

            • 我使用的是 Eclipse 3.7.1 并安装了一些不同的 JRE,但我在这个沙盒项目中使用的是 1.6.0_18 JDK。 logging.properties 文件位于 C:\Program Files\Java\jdk1.6.0_18\jre\lib 中。抱歉,我想在这里换行,但是当我按 Enter 时,它会关闭窗口。当我尝试 System.out.println() 时,我得到了一个空值。显然我的代码没有看到 logging.properties 文件,这就是为什么日志文件没有去我想要的地方。现在我需要弄清楚为什么它看不到logging.properties。好吧,我会开始寻找,如果有人有建议,我正在听……
            • 我在一个新问题中询问了如何将 logging.properties 文件添加到类路径中,并按照我的指示做了。 println() 现在为我提供了日志记录、属性文件的路径,而不是 null。但我仍然没有看到我的日志文件。我有五个和以前一样的 javaX.log 文件,它们都没有改变。关于如何解决这个问题的任何想法?
            • 有人可以提供更多信息吗? “我的日志文件在哪里?”这个问题的答案是什么?打印出属性文件的位置提供了什么线索?我不清楚。
            • 如果它打印null,它可能没有在你的项目中找到那个并使用全局的(JRE 或 JDK 程序目录中的那个)
            • @golimar,是的,它打印null,似乎没有生成日志文件。我从某人那里下载了这个项目,我是 Java 新手。我不明白为什么使用private static final Logger LOGGER = LogManager.getLogger(ClassName..class.getName())。而如果产生了日志历史,那么日志文件存放在哪里?
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-06-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-08-03
            相关资源
            最近更新 更多