Java Log4j默认占位符值

Java Log4j默认占位符值,java,log4j,Java,Log4j,我将log4j与这个appender一起使用: <appender name="fileAppenderRoot" class="org.apache.log4j.FileAppender"> <param name="file" value="${log.location}/logFile.log" /> <layout class="org.apache.log4j.PatternLayout"> <param nam

我将log4j与这个appender一起使用:

<appender name="fileAppenderRoot" class="org.apache.log4j.FileAppender">
    <param name="file" value="${log.location}/logFile.log" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{ISO8601} %-5p [%c{1}] - %m%n" />
    </layout>
</appender>

如果我用
-Dlog.location=/path/to/logs
启动服务器,log4j将登录到
/path/to/logs/logs/logFile.log
,但如果我没有指定任何内容,log4j将无法附加到
/logFile.log


是否可以指定默认占位符值?

否。您需要提供写入日志文件的位置

如果需要在部署war的文件夹中生成日志

<param name="file" value="../logs/logFile.log" />

将在已部署的文件夹中创建
日志文件


我知道这并不能直接回答您的问题,但我发现更好的解决方案是使用整个特定于服务器的log4j配置文件。这允许在每台服务器的基础上定制特定的记录器级别等


WebLogic和GlassFish(可能还有其他服务器)都提供了在特定应用程序的类路径上放置额外文件的机制。您可以使用这些机制来覆盖默认的
log4j.xml
烘焙到战争中。WebLogic提供了和GlassFish。

最简单的方法是在代码中添加默认值

private static void configureLogger() {
    String logLocation = System.getProperty("log.location");
    if (logLocation == null) {
        System.setProperty("log.location", "/path/to/logs");
    }

    // if a logger is needed in the current class, create it after 

    log = Logger.getLogger(SomeClass.class);
}

您需要在使用记录器的所有代码之前添加此代码。例如,可以将其添加到启动servlet中。请不要以通常的方式在这样的servlet中创建带有静态字段初始值设定项的记录器。

那么您想将
.log
文件放在哪里呢。这里的默认位置是什么意思?例如,如果我没有指定log.location属性,我希望登录/tmp/logFile.log,但是如果我指定它(-Dlog.location=/path/to/logs),我希望登录/path/to/logs/logFile.log。如果我知道您需要登录绝对路径权限?>绝对或相对,这不是我真正的问题。我想根据部署战争的系统更改日志位置。如果未指定任何占位符,我只想设置默认占位符值。所需的功能是为“log.location”属性提供默认值,而不是静态设置日志位置。嗯,删除了我的注释中的一些文本。你是对的,他最后的评论可能会改变整个问题。因为它与问题和其他评论相矛盾,我认为我们应该让@Calfater决定他/她需要什么。所以我的回答是一般性的。日志文件将独立于部署路径创建。但位于相同的相对位置。我认为,即使Calfater同意你的回答,但据我所知,原来的问题仍然有效,可能有用。好吧,你对这个问题有什么期望。有一些路径,例如
{CATALINA_HOME}
{USER.APPROOT}
。它们在运行时采用路径