如何在commons-daemon procrun&下解释user.dir系统属性? log4j的?

时间:2011-08-26 12:02:31

标签: java log4j daemon apache-commons procrun

我使用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的其他一些subir)。

根据我从log4j源代码(1.2.16)可以看出,FileAppender只处理声称从java.io.FileOutputStream位置生成相对路径的user.dir和File类

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

3 个答案:

答案 0 :(得分:0)

我在${user.dir}中使用了lo4j.properties并且它已经有效了。你有没有尝试过?

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

通过使用一个绝对路径(甚至前缀为${user.dir} - 在那一点上可以信任 - 即使JVM在内部得到错误的值),如Phil,Amir和我都建议的那样,你避免使用完全问题。