Java Log4j:相对于类路径的文件上的FileAppender

Java Log4j:相对于类路径的文件上的FileAppender,java,log4j,Java,Log4j,我成功地为log4j放置了一个配置文件,并使用以下命令指向它: URL logProperties = Program.class.getResource("log.properties"); PropertyConfigurator.configure(logProperties.getFile()); (我认为它可以做得更简单,我读了一些关于默认属性文件的内容,但不是实际的主题) 问题是:属性文件是从调用方法的类路径加载的,这很好,但我在配置中有如下内容: log4j.appender.

我成功地为log4j放置了一个配置文件,并使用以下命令指向它:

URL logProperties =  Program.class.getResource("log.properties");
PropertyConfigurator.configure(logProperties.getFile());
(我认为它可以做得更简单,我读了一些关于默认属性文件的内容,但不是实际的主题) 问题是:属性文件是从调用方法的类路径加载的,这很好,但我在配置中有如下内容:

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=console.log
我想知道“console.log”也在类路径中,但不幸的是它似乎在可执行文件的当前目录中(从eclipse启动,在/bin文件夹的父目录中)。 是否有某种方法可以在类路径中指定文件,当然不必将完整路径指定为log4netdoes? 编辑 通过这个问题,我了解了
System.getProperty(“user.dir”)
还有.NET

Assembly.GetExecutingAssembly().Location
不幸的是,在我看来,编写${user.dir}/console.log没有任何区别(即日志似乎停留在当前目录中,而不是可执行文件附近。

条目

log4j.appender.R.File=console.log
定义日志语句的输出,即代码中日志语句的位置。
将此输出文件放在类路径中没有意义。相反(如果未指定其他路径),该文件将写入工作目录(当前目录)工作目录和程序所在的位置之间有很大的区别。我会把它放在程序附近,怎么办?最简单的解决方案是指定路径,即
log4j.appender.R.File=C:/myapplication/log/console.log
。如果您有软件的安装例程,安装程序可以将此路径写入配置文件。这会起作用,但如果用户将应用程序移动到其他地方会怎么样?那么您的第一条评论将不再有效。如果您在某个目录中有一个应用程序,并且用户在该目录中启动它,那么日志文件将放在该目录中。如果用户从其他目录启动该应用程序目录,例如shell文件移动应用程序时,shell文件将不再工作。假设应用程序文件夹为
/myapp
,程序位于
/myapp/bin
,并从该目录启动。我会使用相对路径
log4j.appender.R.file=../lo>将日志写入
/myapp/logs
gs/console.log