You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4cxx-user@logging.apache.org by Peter Steele <ps...@maxiscale.com> on 2008/06/09 20:38:02 UTC

Setting log file name dynamically

I am using the following code to set the log file dynamically instead of
defining it in the xml file:

 

        DOMConfigurator::configure(config);

        LoggerPtr logger = Logger::getLogger(cat_name);

        FileAppenderPtr appender = logger->getAppender("FILE");

        Pool p;

        appender->setFile(log_name);

        appender->activateOptions(p);

 

This works with one small side effect. It seems I have to provide a
default setting for the File parameter in the xml config file, otherwise
the configure command complains when the app runs. So I tried doing
this:

 

  <appender name="FILE" class="org.apache.log4j.FileAppender">

    <param name="Append" value="true" />

    <param name="File"   value="TBD" />

    <layout class="org.apache.log4j.PatternLayout">

      <param name="ConversionPattern" value="%d %-5p [%t] [%c{1}]
%m%n"/>

    </layout>

  </appender>

 

but this ended up creating an empty file called TBD before the call to
setFile had a chance to run. I have a workaround where I set File to
/dev/null instead of TBD and this seems to work. Is there a
better/correct way to do this?

]


RE: Setting log file name dynamically

Posted by Peter Steele <ps...@maxiscale.com>.
We don’t use property files, only the xml config file. I tried defining my appender as

 

  <appender name="FILE" class="org.apache.log4j.FileAppender">

    <param name="Append" value="true" />

    <param name="File"   value="${LOGNAME}" />

    <layout class="org.apache.log4j.PatternLayout">

      <param name="ConversionPattern" value="%d %-5p [%t] [%c{1}] %m%n"/>

    </layout>

  </appender>

 

but made the call

 

setenv("LOGNAME", "tester.log", 1);

 

in my app and tried sending a log message to this logger. The message disappeared though--no “tester.log” was created. Not sure where the message got logged…

 

From: David Schornack [mailto:dschornack@gtplimited.com] 
Sent: Monday, June 09, 2008 12:26 PM
To: Log4CXX User
Subject: Re: Setting log file name dynamically

 

Yes, there is a much easier method, at least this works very well for me.

In log4j.properties, define the following ...

    log4j.rootLogger=info, R
    log4j.appender.R=org.apache.log4j.RollingFileAppender
    log4j.appender.R.File=../data/${logfile.name}

and then in your code you simple set the name as follows ...

   logger = Logger::getLogger("MyApp");
   setenv("logfile.name", "MyApp.log", 1);

Very simple!

David

On Mon, 2008-06-09 at 11:38 -0700, Peter Steele wrote: 

I am using the following code to set the log file dynamically instead of defining it in the xml file:

 

        DOMConfigurator::configure(config);

        LoggerPtr logger = Logger::getLogger(cat_name);

        FileAppenderPtr appender = logger->getAppender("FILE");

        Pool p;

        appender->setFile(log_name);

        appender->activateOptions(p);

 

This works with one small side effect. It seems I have to provide a default setting for the File parameter in the xml config file, otherwise the configure command complains when the app runs. So I tried doing this:

 

  <appender name="FILE" class="org.apache.log4j.FileAppender">

    <param name="Append" value="true" />

    <param name="File"   value="TBD" />

    <layout class="org.apache.log4j.PatternLayout">

      <param name="ConversionPattern" value="%d %-5p [%t] [%c{1}] %m%n"/>

    </layout>

  </appender>

 

but this ended up creating an empty file called TBD before the call to setFile had a chance to run. I have a workaround where I set File to /dev/null instead of TBD and this seems to work. Is there a better/correct way to do this?

]



	

 


Re: Setting log file name dynamically

Posted by David Schornack <ds...@gtplimited.com>.
Yes, there is a much easier method, at least this works very well for
me.

In log4j.properties, define the following ...

    log4j.rootLogger=info, R
    log4j.appender.R=org.apache.log4j.RollingFileAppender
    log4j.appender.R.File=../data/${logfile.name}

and then in your code you simple set the name as follows ...

   logger = Logger::getLogger("MyApp");
   setenv("logfile.name", "MyApp.log", 1);

Very simple!

David

On Mon, 2008-06-09 at 11:38 -0700, Peter Steele wrote:
> I am using the following code to set the log file dynamically instead
> of defining it in the xml file:
> 
>  
> 
>         DOMConfigurator::configure(config);
> 
>         LoggerPtr logger = Logger::getLogger(cat_name);
> 
>         FileAppenderPtr appender = logger->getAppender("FILE");
> 
>         Pool p;
> 
>         appender->setFile(log_name);
> 
>         appender->activateOptions(p);
> 
>  
> 
> This works with one small side effect. It seems I have to provide a
> default setting for the File parameter in the xml config file,
> otherwise the configure command complains when the app runs. So I
> tried doing this:
> 
>  
> 
>   <appender name="FILE" class="org.apache.log4j.FileAppender">
> 
>     <param name="Append" value="true" />
> 
>     <param name="File"   value="TBD" />
> 
>     <layout class="org.apache.log4j.PatternLayout">
> 
>       <param name="ConversionPattern" value="%d %-5p [%t] [%c{1}] %m%
> n"/>
> 
>     </layout>
> 
>   </appender>
> 
>  
> 
> but this ended up creating an empty file called TBD before the call to
> setFile had a chance to run. I have a workaround where I set File
> to /dev/null instead of TBD and this seems to work. Is there a
> better/correct way to do this?
> 
> ]
> 
>