当我将应用程序部署到运行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)\或其他任何地方。我已经完成了对硬盘的全面搜索,但没有任何回复。
此文件应存储在何处?我的属性设置正确吗?很困惑......
谢谢!
答案 0 :(得分:6)
如果有人偶然发现这篇文章,我想记录我是如何解决它的。
首先,正如DwB正确指出的那样,问题确实是用户的帐户没有足够的权限来创建logging.log文件。在我的代码中,我有一个正在执行的catch块,并包含在文件写入错误时退出系统的代码。由于记录细节正是我试图编写的内容,因此我无法获得任何输出以便将此作为我问题的根源。
一旦我意识到这一点,我只需要改变我写日志文件的位置。而不是将其写入根目录(C:\)或jar文件所在的文件夹(C:\ Program Files \),这两个地方都是我不能保证用户拥有完全权限的地方,我决定在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
这会将文件定向到我刚刚创建的文件夹。
一旦我这样做了,并添加了一些精心设置的日志消息,我就能找到其他问题,现在一切正常。
我希望这可以帮助别人。如果有人有任何建议,请发帖。