The problem with system properties is that they are shared by all webapps running inside the same tomcat instance. (I believe Jetty uses different sys props per webapp).
http://www.mail-archive.com/[email protected]/msg10597.html Maybe someone should file a RFE. Below is the class that we use to overcome this limitation: Maarten ===================================== package org.apache.log4j.xml; import java.net.URL; import java.util.Properties; import org.apache.log4j.LogManager; /** * Class for configuring log4j from an xml file, resolving ant style placeholders from the given Properties object. * * This class has to be in the "org.apache.log4j.xml" package because it accesses a package-private field in * org.apache.log4j.xml.DOMConfigurator * */ public class PropertyDomConfigurator { /** * configure log4j from an xml file, resolving ant style placeholders from the given Properties object * @param url URL to the xml config * @param properties used for resolving placeholders */ public static void configure(final URL url, Properties properties) { DOMConfigurator configurator = new DOMConfigurator(); configurator.props = new Properties(properties); configurator.doConfigure(url, LogManager.getLoggerRepository()); } } On Sun, Apr 11, 2010 at 6:33 PM, Jacob Kjome <[email protected]> wrote: > > Could you be running into?... > https://issues.apache.org/bugzilla/show_bug.cgi?id=43325 > > That said, you realize that you can just set system properties for this, > right? So given... > > <param name="File" value="${log.dir}/mylog.log"/> > > You can set... > > -Dlog.dir=/some/path/to/log/directory > > > You should make sure that the path exists. At least in older versions, > Log4j wouldn't create this for you. That might have been changed in newer > versions, but I wouldn't count on it. > > > Jake > > > > On 4/9/2010 2:43 AM, Camer38 wrote: > >> >> Any chance for a help or at lease link to working example of >> DOMConfigurator.subst >> >> >> >> >> I try to use DOMConfigurator.subst to change dynamically in Java code >> location of the output logging file. See log4j.xml below. >> >> The following code is called in main method to set up file location: >> >> private static void setLogging(final String logDirectory, final String >> logFileName) { >> Properties props = new Properties(); >> props.put("dir.log", logDirectory); >> props.put("file.name", logFileName); >> String s3 = DOMConfigurator.subst("${dir.log}", props); >> String s4 = DOMConfigurator.subst("${file.name}", props); >> } >> >> It does not work for me because I get following error: >> >> log4j:ERROR setFile(null,true) call failed. >> java.io.FileNotFoundException: \ (The system cannot find the path >> specified) >> at java.io.FileOutputStream.openAppend(Native Method) >> at java.io.FileOutputStream.<init>(FileOutputStream.java:177) >> at java.io.FileOutputStream.<init>(FileOutputStream.java:102) >> at org.apache.log4j.FileAppender.setFile(FileAppender.java:290) >> at >> org.apache.log4j.RollingFileAppender.setFile(RollingFileAppender.java:194) >> at >> org.apache.log4j.FileAppender.activateOptions(FileAppender.java:164) >> at >> org.apache.log4j.config.PropertySetter.activate(PropertySetter.java:257) >> at >> >> org.apache.log4j.xml.DOMConfigurator.parseAppender(DOMConfigurator.java:285) >> at >> >> org.apache.log4j.xml.DOMConfigurator.findAppenderByName(DOMConfigurator.java:171) >> at >> >> org.apache.log4j.xml.DOMConfigurator.findAppenderByReference(DOMConfigurator.java:184) >> at >> >> org.apache.log4j.xml.DOMConfigurator.parseChildrenOfLoggerElement(DOMConfigurator.java:502) >> at >> org.apache.log4j.xml.DOMConfigurator.parseRoot(DOMConfigurator.java:471) >> at >> org.apache.log4j.xml.DOMConfigurator.parse(DOMConfigurator.java:921) >> at >> org.apache.log4j.xml.DOMConfigurator.doConfigure(DOMConfigurator.java:790) >> at >> org.apache.log4j.xml.DOMConfigurator.doConfigure(DOMConfigurator.java:696) >> at >> >> org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:471) >> at org.apache.log4j.LogManager.<clinit>(LogManager.java:125) >> at org.apache.log4j.Logger.getLogger(Logger.java:118) >> at >> >> curam.tools.upgradehelper.SampleJavaSourceMigrationTool.<clinit>(SampleJavaSourceMigrationTool.java:36) >> >> Could you give me a tip what am I missing, please? >> >> Marcin >> >> log4j.xml >> >> <?xml version="1.0" encoding="UTF-8"?> >> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> >> <log4j:configuration >> debug="null" >> xmlns:log4j="http://jakarta.apache.org/log4j/" >> threshold="null" >> >>> >>> >> <appender >> class="org.apache.log4j.RollingFileAppender" >> name="LogFileAppender" >> > >> >> >> >> >> <layout class="org.apache.log4j.PatternLayout"> >> >> </layout> >> </appender> >> >> <!-- Loggers --> >> <root> >> <level value="DEBUG"/> >> <appender-ref ref="CONSOLE"/> >> <appender-ref ref="LogFileAppender"/> >> </root> >> </log4j:configuration> >> > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] > >
