10

当我将应用程序部署到运行 JRE 1.7 的其他计算机时,我遇到了崩溃的问题。当我在 PC 上的 NetBeans 内部(甚至直接从 JAR 文件)运行它时,一切都很好。但在另一台计算机上,它在执行期间在特定事件(按钮单击)时失败。

所以,我学习了使用 log4j 库进行日志记录。这给了我一些关于我的应用程序问题的信息,并且日志记录工作完美,再次在我的计算机上。但是,当我将 JAR 文件部署到仅运行 JRE(Java 7 Update 17)的其他计算机时,我找不到任何日志文件的痕迹。

这是我的 log4j.properties 文件:

 # Root logger option 
 log4j.rootLogger=INFO, file, stdout  

 # Direct log messages to a log file log4j.appender.file=org.apache.log4j.RollingFileAppender
 log4j.appender.file.File=C:\logging.log
 log4j.appender.file.MaxFileSize=1MB
 log4j.appender.file.MaxBackupIndex=1
 log4j.appender.file.layout=org.apache.log4j.PatternLayout
 log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}
 %-5p %c{1}:%L - %m%n  

 # Direct log messages to stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender
 log4j.appender.stdout.Target=System.out
 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
 log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}
 %-5p %c{1}:%L - %m%n

在我的计算机上,我可以在项目文件夹中看到 logging.log 文件。在这个程度上,一切都完美无缺。但是,在用户 PC 上,根本没有该文件的迹象。不在 C:\ (我认为它会在的地方),不在 C:\Program Files (x86)\ 或其他任何地方。我已经完成了对我的硬盘的完整搜索,但没有任何返回。

这个文件应该存储在哪里?我的属性设置正确吗?很困惑...

谢谢!

4

1 回答 1

6

万一有人偶然发现这篇文章,我想记录下我是如何解决它的。

首先,正如 DwB 正确指出的那样,问题确实是用户的帐户没有足够的权限来创建 logging.log 文件。在我的代码中,我有一个正在执行的 catch 块,其中包含在发生文件写入错误时退出系统的代码。由于这正是我试图编写的日志记录详细信息,因此我无法获得任何输出来提示我将此作为我的问题的根源。

一旦我意识到这一点,我只需要更改写入日志文件的位置。我决定将其写入根目录 (C:\) 或 jar 文件所在的文件夹 (C:\在他们的 AppData 路径中创建一个文件夹。

我的程序的第一行现在是对该函数的调用(使用通用名称 MyProgram):

private static void makeAppDataFolder() {
     File dir = new File(System.getenv("APPDATA") + "\\MyProgram");
     if (!dir.exists()) {dir.mkdir();}
}

这会在用户帐户的 \AppData\Roaming 中创建一个名为 MyProgram 的文件夹。由于此路径是用户帐户路径的一部分,我相信用户将始终能够对其进行写入,从而解决权限问题。如果有人知道,请告诉我。

然后,在我的 log4j.properties 文件中,我更改了行

log4j.appender.file.File=logging.log

log4j.appender.file.File=${user.home}/Application Data/MyProgram/logging.log 

这会将文件定向到我刚刚创建的文件夹。

一旦我这样做了,并添加了一些放置良好的日志消息,我就能找到我的其他问题,现在一切正常。

我希望这可以帮助某人。如果有人有任何建议,请发表。

于 2013-03-27T19:45:44.393 回答