Log4J - J2EE - 动态变量

时间:2014-05-13 08:14:50

标签: java variables dynamic jvm log4j

在log4j.xml配置中使用JVM变量不起作用...

System.setProperty("log_dir", logDirPath);

<param name="file" value="${log_dir}\toto.log" />

如果我在调试中运行时重新加载我的Web服务器,它可以工作...

**更新

package com.webapp.startup;

import java.io.PrintStream;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

import com.webapp.objects.impl.LoggingOutputStream;

public class Log4jStartup implements ServletContextListener{

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
    }

    @Override
    public void contextInitialized(ServletContextEvent event) {
        try {
            ServletContext context = event.getServletContext();

            System.setProperty("log_dir", "C:/path");

            System.setErr(new PrintStream(new LoggingOutputStream(Logger.getRootLogger(), Level.ERROR), true));
            System.setOut(new PrintStream(new LoggingOutputStream(Logger.getRootLogger(), Level.INFO), true));

            String path = context.getRealPath("/WEB-INF/classes/log4j.xml");
        PropertyConfigurator.configure(path);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在setErr和setOut之前初始化属性... 谢谢大家!

2 个答案:

答案 0 :(得分:1)

您可能在log4j系统初始化后填充该属性。

为了以前完成它,您可以在启动服务器时从命令行提供它,或者使用this example中的初始化servlet。滚动到Tomcat下的默认初始化,请记住,您只需要指定属性而不是log4j配置文件。

答案 1 :(得分:0)

你应该告诉我们这个属性何时设置,但是为时已晚。 Log4j通常在设置此属性之前很早就已初始化。我建议您在Web服务器启动脚本的初始化块中设置此参数。使用-Dlog_dir=path语法。

PS是什么服务器? Tomcat的?