【问题标题】:Log4j: FileAppender on file relative to classpathLog4j:相对于类路径的文件上的 FileAppender
【发布时间】:2014-08-01 13:48:41
【问题描述】:

我设法为 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 文件夹的父目录中)。 有没有办法在类路径中指定一个文件,当然没有像 log4net 那样指定完整路径? 编辑 通过这个 SO 问题What is the .NET equivalent of java's System.getProperty("user.dir")? 我了解了System.getProperty("user.dir") 的等价性 和.NET

Assembly.GetExecutingAssembly().Location

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

【问题讨论】:

    标签: java log4j


    【解决方案1】:

    条目

    log4j.appender.R.File=console.log
    

    定义日志语句的输出,即代码中日志语句的位置。 将此输出文件放在类路径中是没有意义的。相反(如果未指定其他路径),该文件将写入应用程序的工作目录(当前目录)中。

    【讨论】:

    • 工作目录和程序所在位置有很大区别。我会把它放在靠近程序的地方,我该怎么办?
    • 最简单的解决方案是指定路径,即log4j.appender.R.File=C:/myapplication/log/console.log。如果您的软件有安装例程,安装程序可以将此路径写入配置文件。
    • 这可行,但如果用户将应用程序移到其他地方怎么办?
    • 那么您的第一条评论不再可行。如果您在某个目录中有一个应用程序并且用户在那里启动它,那么日志文件将放在该目录中。如果用户从不同的目录启动应用程序,例如shell 文件 当您移动应用程序时,shell 文件将不再起作用。
    • 假设您的应用程序文件夹是/myapp,您的程序位于/myapp/bin 并从该目录启动。我会使用相对路径log4j.appender.R.File=../logs/console.log 将日志写入/myapp/logs
    猜你喜欢
    • 2011-02-27
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    相关资源
    最近更新 更多