【问题标题】:How is user.dir System Property interpreted under commons-daemon procrun & log4j?在 commons-daemon procrun & log4j 下 user.dir 系统属性如何解释?
【发布时间】:2011-08-26 12:02:31
【问题描述】:

我已经使用tomcat 5.5.33附带的procrun版本安装了一个java批处理:

   Commons Daemon Service Runner version 1.0.5.0/Win32 (Jan  5 2011) 
   Copyright (c) 2000-2011 The Apache Software Foundation.

在安装中,我指定(在其他 JVM 选项中):

  --JvmOptions="-Duser.dir=C:\LOCAL\serverapps"

我的 log4j.properties 配置包括:

   log4j.appender.InfoLogFile.File=../logs/info.log

但是,info.log 文件正在被写入:

   C:\WINDOWS\logs

我在很多不同的地方检查了user.dir 的值,它始终是C:\LOCAL\serverapps

但是,log4j 的行为就像user.dir=C:\Windows\System32(或C:\Windows 的其他子目录)。

据我从 log4j 源 (1.2.16) 得知,FileAppender 仅处理 java.io.FileOutputStream 和 File 类,它们声称使路径相对于 user.dir 位置。

我已经解决了这个问题,但我很好奇:还有其他人遇到过这种行为吗?如果是这样,到底发生了什么?

【问题讨论】:

    标签: java log4j daemon apache-commons procrun


    【解决方案1】:

    FileAppender,当给定一个相对路径时,创建一个包含当前工作目录的文件 - 而不是用户主目录。

    您需要在文件名中传递 ${user.dir}。

    SRC: http://svn.apache.org/viewvc/logging/log4j/trunk/src/main/java/org/apache/log4j/FileAppender.java?view=markup

    编辑:请参阅下面的评论以进行更正 - user.dir != user.home

    http://bugs.sun.com/view_bug.do?bug_id=4117557

    【讨论】:

    • user.home = 用户主目录 user.dir = 用户当前工作目录
    • 哎呀。对于那个很抱歉。我刚刚发现:bugs.sun.com/view_bug.do?bug_id=4117557 似乎 Oracle (...) 意识到了一些错误,因为 user.dir 似乎并不总是受到尊重。看起来您最好使用非标准系统属性(正如您在下面的评论中所写)。
    • PhilW,您的评论有正确的失败原因(Sun/Oracle 错误),但您的原始答案有点误导。您不必将${user.dir} 作为文件名的前缀传递,因为FileAppender 只是移交给FileInputStream,并且该过程应该尊重user.dir,但没有。如果您可以更新原始答案以直接指向错误,我将删除我接受的答案并接受您的答案,因为您正确提出了 Java 错误 - 这是我所追求的解释。
    【解决方案2】:

    我在lo4j.properties 中使用了${user.dir},它确实有效。你有没有尝试过?

    log4j.appender.InfoLogFile.File=${user.dir}/logs/info.log
    

    【讨论】:

    • 我曾经有过一个非常相似的想法。添加了一个新属性${logging.base} 并将其放入log4j.properties 文件中。为了测试您的想法,我使用了${user.dir} 并将文件放在正确的目录中(即不在C:\WINDOWS 下)。然而......这仍然没有回答这个问题。事实上,它增加了更多的阴谋。实际发生了什么导致相对路径未相对于 ${user.dir} 进行解释?
    【解决方案3】:

    PhilW 的评论指出了对原始问题的正确答案。也就是说,当通过命令行设置user.dir 时,Oracle/Sun 会声明一个问题http://bugs.sun.com/view_bug.do?bug_id=4117557。这就是为什么在写出日志文件时无法正确理解相对路径的原因。

    按照 Phil、Amir 和我的建议,通过使用绝对路径(甚至以 ${user.dir} 为前缀——此时可以信任——即使 JVM 内部获取错误值),您可以完全避免这个问题.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多