2013-03-25 133 views
9

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

所以,我了解了使用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)\或任何其他地方。我已经完成了我的硬盘的完整搜索,但没有回来。

这个文件应该存储在哪里?我的属性设置是否正确?非常困惑...

谢谢!

+3

目标机器上的用户能否在c盘的根目录下创建文件? – DwB 2013-03-25 18:08:09

+2

首先,属性文件中的反斜杠需要加倍:'C:\\ logging.log'。或者使用正斜杠,因为windows会接受它们:'C:\ logging.log' – Kenster 2013-03-25 18:11:21

+0

DwB - 是的,它们拥有c:\的全部权限。我不相信这是一个权限问题。 – Alex 2013-03-25 19:03:03

回答

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();} 
} 

这将创建一个用户的在\应用程序数据\漫游帐户名为MyProgram文件夹中。由于此路径是用户帐户路径的一部分,因此我相信用户将始终可以写入,从而解决权限问题。如果有人知道,请告诉我。

然后,在我的log4j.properties文件,我改线

log4j.appender.file.File=logging.log 

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

此指导文件,我刚创建的文件夹。

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

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