You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4net-user@logging.apache.org by Ron Grabowski <ro...@yahoo.com> on 2007/08/03 04:51:36 UTC

Re: Disable/enable appender for all loggers

Instead of removing the appender you could just set its threshold to OFF then when you want to enable it again you can set it back to DEBUG:

// untested
public static void SetThreshold(string appenderName, Level threshold)
{
    foreach (AppenderSkeleton appender in LogManager.GetRepository().GetAppenders())
    {
        if (appender.Name == appenderName)
        {
            appender.Threshold = threshold;
            appender.ActivateOptions();
            break;
        }
    }
}


----- Original Message ----

From: Radovan Raszka <ra...@hasam.cz>

To: log4net-user@logging.apache.org

Sent: Friday, July 27, 2007 2:23:05 AM

Subject: Disable/enable appender for all loggers



Disable/enable appender for all loggers           Hello,  

I am using three appenders in my log4net configuration (see bellow). But I need programatically disable and reenable RollingFile appender at certain situations. Is there any simple solution? I tried to use programatic configuration only.

  My config:  

<log4net>  

                <appender name="Console" type="log4net.Appender.ConsoleAppender">  

                        <layout type="log4net.Layout.PatternLayout">  

                                <!-- Pattern to output the caller's file name and line number -->  

                                <conversionPattern value="%date{HH:mm:ss,fff} %5level [%thread] %message%n" />  

                        </layout>  

                        <Threshold value="DEBUG" />  

                </appender> 

                  <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">  

                        <appendToFile value="true" />  

                        <file value="Service.log" />  

                        <layout type="log4net.Layout.PatternLayout">  

                                <conversionPattern value="%date{dd-MM-yyyy HH:mm:ss,fff} %5level [%2thread] %message (%logger{1}:%line)%n" />

                          </layout>  

                        <rollingStyle value="Date" />  

                        <Threshold value="DEBUG" />  

                </appender> 

                  <appender name="EvLog" type="log4net.Appender.EventLogAppender">  

                        <ApplicationName value="IPserver" />  

                        <layout type="log4net.Layout.PatternLayout">  

                                <conversionPattern value="[%thread] %message (%logger{1})" />  

                        </layout>  

                        <Threshold value="INFO" />  

                </appender> 

                  <root>  

                        <level value="DEBUG" />  

                        <appender-ref ref="RollingFile" />  

                        <appender-ref ref="Console" />  

                        <appender-ref ref="EvLog" />  

                </root>  

        </log4net> 

  I tried to complete rewrite this config into C# code: 

  private readonly log4net.Appender.ConsoleAppender AppConsole;  

private readonly log4net.Appender.RollingFileAppender AppFile;  

private readonly log4net.Appender.EventLogAppender AppEvlog;  

private log4net.Repository.Hierarchy.RootLogger rootLog;  

//XmlConfigurator.Configure(new System.IO.FileInfo(IPserverCore.IPserver.GetAppPath() + "log4net.config"));  

//xml configurator replaced by code  

AppConsole = new log4net.Appender.ConsoleAppender();  

AppConsole.Layout = new log4net.Layout.PatternLayout("%date{HH:mm:ss,fff} %5level [%thread] %message%n");  

AppConsole.Threshold = log4net.Core.Level.Debug; 

  AppFile = new log4net.Appender.RollingFileAppender();  

AppFile.AppendToFile = true;  

AppFile.Layout = new log4net.Layout.PatternLayout("%date{dd-MM-yyyy HH:mm:ss,fff} %5level [%2thread] %message (%logger{1}:%line)%n");

  AppFile.File = "Service.log";  

AppFile.RollingStyle = log4net.Appender.RollingFileAppender.RollingMode.Date;  

AppFile.Threshold = log4net.Core.Level.Debug; 

  AppEvlog = new log4net.Appender.EventLogAppender();  

AppEvlog.Layout = new log4net.Layout.PatternLayout("[%thread] %message (%logger{1})");  

AppEvlog.ApplicationName = "IPserver";  

AppEvlog.Threshold = log4net.Core.Level.Info; 

  rootLog = new log4net.Repository.Hierarchy.RootLogger(log4net.Core.Level.Info);  

                          

rootLog.AddAppender(AppConsole);  

rootLog.AddAppender(AppFile);  

rootLog.AddAppender(AppEvlog);  

//----  

log = LogManager.GetLogger(typeof(IPservice));  

Log.Info("Start"); // no log produced here...  

rootLog.RemoveAppender(AppFile); // disable file logging  

...  

But after rewriting aplication doesn't create any logs….  

Did I miss some settings or am I complete wrong? 

  Thanks for any suggestions  

Radovan Raszka 

  








RE: Disable/enable appender for all loggers

Posted by Radovan Raszka <ra...@hasam.cz>.
Great!
I tested and used first solution, because it seems better for me (file
path + name is independent on the program code).
Thanks for help
Radovan
________________________________

From: Vanderkolk, John [mailto:John.Vanderkolk@compuware.com] 
Sent: Monday, August 06, 2007 10:16 PM
To: Log4NET User
Subject: RE: Disable/enable appender for all loggers



	That's because of how log4net configures itself. When the
repository finds a reference to a file appender in a logger that it is
creating, it will automatically ask its LockingModel to create that
file.  Even if your program has no intent on writing to that file
log4net will still create it as soon as it knows that you might write to
it. I managed to find two ways to accomplish what you want.

	

	1.

	

	Create a new locking model and use that as your locking model:

	

	public class MyLock : log4net.Appender.FileAppender.MinimalLock

	{

	      public override Stream AcquireLock()

	      {

	            if (CurrentAppender.Threshold ==
log4net.Core.Level.Off)

	                  return null;

	            return base.AcquireLock();

	      }

	}

	

	Now in the config file, set the threshold to start out as:
<threshold value="OFF" /> and make sure you set this new LockingModel as
you model: <lockingModel type="Namespace.MyLock" />. Now when your
locking model is called to create the file, if the threshold is set to
OFF, it will refuse. This will cause an internal exception (no way
around it) but I see no reason to believe this is an invalid method.

	

	2.

	

	If in the config file you specify an empty string as the file
name (<file value=""/>), when log4net configures itself with that
appender it will throw an exception to itself and give up on creating
any file for that appender, but importantly, it WILL create the appender
anyway.  So if you do that then the first time that you want to log to
it you can specify a file like this:

	

	public void directAppenderToFile(string appender, string path)

	{

	      log4net.Appender.IAppender[] appenders =
log4net.LogManager.GetRepository().GetAppenders();

	

	      for (int i = 0; i < appenders.Length; ++i)

	      {

	            log4net.Appender.FileAppender curAppender =
appenders[i] as log4net.Appender.FileAppender;

	

	            if (curAppender != null && curAppender.Name ==
appender)

	            {

	                  curAppender.File = path;

	                  curAppender.ActivateOptions();

	            }

	      }

	}

	

	I personally prefer the first method, but it's up to you to
decide which one works best for you.

	

	Happy Logging,

	John VanderKolk 


	The contents of this e-mail are intended for the named addressee
only. It contains information that may be confidential. Unless you are
the named addressee or an authorized designee, you may not copy or use
it, or disclose it to anyone else. If you received it in error please
notify us immediately and then destroy it.
	

	From: Radovan Raszka [mailto:raszka@hasam.cz] 
	Sent: Friday, August 03, 2007 5:27 PM
	To: Log4NET User
	Subject: RE: Disable/enable appender for all loggers

	

	Thanks for proposal to John and Ron, it works well.

	But when I tried the reverse strategy (set Threshold to OFF in
config file and change to DEBUG when needed), I noticed that empty log
file (Service.log in my configuration) is created (file size = 0 bytes).

	Can this feature be disabled?

	 


RE: Disable/enable appender for all loggers

Posted by "Vanderkolk, John" <Jo...@compuware.com>.
That's because of how log4net configures itself. When the repository finds a reference to a file appender in a logger that it is creating, it will automatically ask its LockingModel to create that file.  Even if your program has no intent on writing to that file log4net will still create it as soon as it knows that you might write to it. I managed to find two ways to accomplish what you want.

 

1.

 

Create a new locking model and use that as your locking model:

 

public class MyLock : log4net.Appender.FileAppender.MinimalLock

{

      public override Stream AcquireLock()

      {

            if (CurrentAppender.Threshold == log4net.Core.Level.Off)

                  return null;

            return base.AcquireLock();

      }

}

 

Now in the config file, set the threshold to start out as: <threshold value="OFF" /> and make sure you set this new LockingModel as you model: <lockingModel type="Namespace.MyLock" />. Now when your locking model is called to create the file, if the threshold is set to OFF, it will refuse. This will cause an internal exception (no way around it) but I see no reason to believe this is an invalid method.

 

2.

 

If in the config file you specify an empty string as the file name (<file value=""/>), when log4net configures itself with that appender it will throw an exception to itself and give up on creating any file for that appender, but importantly, it WILL create the appender anyway.  So if you do that then the first time that you want to log to it you can specify a file like this:

 

public void directAppenderToFile(string appender, string path)

{

      log4net.Appender.IAppender[] appenders = log4net.LogManager.GetRepository().GetAppenders();

 

      for (int i = 0; i < appenders.Length; ++i)

      {

            log4net.Appender.FileAppender curAppender = appenders[i] as log4net.Appender.FileAppender;

 

            if (curAppender != null && curAppender.Name == appender)

            {

                  curAppender.File = path;

                  curAppender.ActivateOptions();

            }

      }

}

 

I personally prefer the first method, but it's up to you to decide which one works best for you.

 

Happy Logging,

John VanderKolk 

From: Radovan Raszka [mailto:raszka@hasam.cz] 
Sent: Friday, August 03, 2007 5:27 PM
To: Log4NET User
Subject: RE: Disable/enable appender for all loggers

 

Thanks for proposal to John and Ron, it works well.

But when I tried the reverse strategy (set Threshold to OFF in config file and change to DEBUG when needed), I noticed that empty log file (Service.log in my configuration) is created (file size = 0 bytes).

Can this feature be disabled?

 

I think it would be great to add some samples of programatic configuration into SDK documentation - current documentation is completely out of any example.

Radovan

 


The contents of this e-mail are intended for the named addressee only. It contains information that may be confidential. Unless you are the named addressee or an authorized designee, you may not copy or use it, or disclose it to anyone else. If you received it in error please notify us immediately and then destroy it.


Od: Ron Grabowski [mailto:rongrabowski@yahoo.com]
Odesláno: pá 3.8.2007 4:51
Komu: Log4NET User
Předmět: Re: Disable/enable appender for all loggers

Instead of removing the appender you could just set its threshold to OFF then when you want to enable it again you can set it back to DEBUG:

// untested
public static void SetThreshold(string appenderName, Level threshold)
{
    foreach (AppenderSkeleton appender in LogManager.GetRepository().GetAppenders())
    {
        if (appender.Name == appenderName)
        {
            appender.Threshold = threshold;
            appender.ActivateOptions();
            break;
        }
    }
}


----- Original Message ----

From: Radovan Raszka <ra...@hasam.cz>

To: log4net-user@logging.apache.org

Sent: Friday, July 27, 2007 2:23:05 AM

Subject: Disable/enable appender for all loggers



Disable/enable appender for all loggers           Hello, 

I am using three appenders in my log4net configuration (see bellow). But I need programatically disable and reenable RollingFile appender at certain situations. Is there any simple solution? I tried to use programatic configuration only.

  My config: 

<log4net> 

                <appender name="Console" type="log4net.Appender.ConsoleAppender"> 

                        <layout type="log4net.Layout.PatternLayout"> 

                                <!-- Pattern to output the caller's file name and line number --> 

                                <conversionPattern value="%date{HH:mm:ss,fff} %5level [%thread] %message%n" /> 

                        </layout> 

                        <Threshold value="DEBUG" /> 

                </appender>

                  <appender name="RollingFile" type="log4net.Appender.RollingFileAppender"> 

                        <appendToFile value="true" /> 

                        <file value="Service.log" /> 

                        <layout type="log4net.Layout.PatternLayout"> 

                                <conversionPattern value="%date{dd-MM-yyyy HH:mm:ss,fff} %5level [%2thread] %message (%logger{1}:%line)%n" />

                          </layout> 

                        <rollingStyle value="Date" /> 

                        <Threshold value="DEBUG" /> 

                </appender>

                  <appender name="EvLog" type="log4net.Appender.EventLogAppender"> 

                        <ApplicationName value="IPserver" /> 

                        <layout type="log4net.Layout.PatternLayout"> 

                                <conversionPattern value="[%thread] %message (%logger{1})" /> 

                        </layout> 

                        <Threshold value="INFO" /> 

                </appender>

                  <root> 

                        <level value="DEBUG" /> 

                        <appender-ref ref="RollingFile" /> 

                        <appender-ref ref="Console" /> 

                        <appender-ref ref="EvLog" /> 

                </root> 

        </log4net>

  I tried to complete rewrite this config into C# code:

  private readonly log4net.Appender.ConsoleAppender AppConsole; 

private readonly log4net.Appender.RollingFileAppender AppFile; 

private readonly log4net.Appender.EventLogAppender AppEvlog; 

private log4net.Repository.Hierarchy.RootLogger rootLog; 

//XmlConfigurator.Configure(new System.IO.FileInfo(IPserverCore.IPserver.GetAppPath() + "log4net.config")); 

//xml configurator replaced by code 

AppConsole = new log4net.Appender.ConsoleAppender(); 

AppConsole.Layout = new log4net.Layout.PatternLayout("%date{HH:mm:ss,fff} %5level [%thread] %message%n"); 

AppConsole.Threshold = log4net.Core.Level.Debug;

  AppFile = new log4net.Appender.RollingFileAppender(); 

AppFile.AppendToFile = true; 

AppFile.Layout = new log4net.Layout.PatternLayout("%date{dd-MM-yyyy HH:mm:ss,fff} %5level [%2thread] %message (%logger{1}:%line)%n");

  AppFile.File = "Service.log"; 

AppFile.RollingStyle = log4net.Appender.RollingFileAppender.RollingMode.Date; 

AppFile.Threshold = log4net.Core.Level.Debug;

  AppEvlog = new log4net.Appender.EventLogAppender(); 

AppEvlog.Layout = new log4net.Layout.PatternLayout("[%thread] %message (%logger{1})"); 

AppEvlog.ApplicationName = "IPserver"; 

AppEvlog.Threshold = log4net.Core.Level.Info;

  rootLog = new log4net.Repository.Hierarchy.RootLogger(log4net.Core.Level.Info); 

                         

rootLog.AddAppender(AppConsole); 

rootLog.AddAppender(AppFile); 

rootLog.AddAppender(AppEvlog); 

//---- 

log = LogManager.GetLogger(typeof(IPservice)); 

Log.Info("Start"); // no log produced here... 

rootLog.RemoveAppender(AppFile); // disable file logging 

... 

But after rewriting aplication doesn't create any logs.... 

Did I miss some settings or am I complete wrong?

  Thanks for any suggestions 

Radovan Raszka

RE: Disable/enable appender for all loggers

Posted by Radovan Raszka <ra...@hasam.cz>.
Thanks for proposal to John and Ron, it works well.
But when I tried the reverse strategy (set Threshold to OFF in config file and change to DEBUG when needed), I noticed that empty log file (Service.log in my configuration) is created (file size = 0 bytes).
Can this feature be disabled?
 
I think it would be great to add some samples of programatic configuration into SDK documentation - current documentation is completely out of any example.
Radovan

________________________________

Od: Ron Grabowski [mailto:rongrabowski@yahoo.com]
Odesláno: pá 3.8.2007 4:51
Komu: Log4NET User
Předmět: Re: Disable/enable appender for all loggers



Instead of removing the appender you could just set its threshold to OFF then when you want to enable it again you can set it back to DEBUG:

// untested
public static void SetThreshold(string appenderName, Level threshold)
{
    foreach (AppenderSkeleton appender in LogManager.GetRepository().GetAppenders())
    {
        if (appender.Name == appenderName)
        {
            appender.Threshold = threshold;
            appender.ActivateOptions();
            break;
        }
    }
}


----- Original Message ----

From: Radovan Raszka <ra...@hasam.cz>

To: log4net-user@logging.apache.org

Sent: Friday, July 27, 2007 2:23:05 AM

Subject: Disable/enable appender for all loggers



Disable/enable appender for all loggers           Hello, 

I am using three appenders in my log4net configuration (see bellow). But I need programatically disable and reenable RollingFile appender at certain situations. Is there any simple solution? I tried to use programatic configuration only.

  My config: 

<log4net> 

                <appender name="Console" type="log4net.Appender.ConsoleAppender"> 

                        <layout type="log4net.Layout.PatternLayout"> 

                                <!-- Pattern to output the caller's file name and line number --> 

                                <conversionPattern value="%date{HH:mm:ss,fff} %5level [%thread] %message%n" /> 

                        </layout> 

                        <Threshold value="DEBUG" /> 

                </appender>

                  <appender name="RollingFile" type="log4net.Appender.RollingFileAppender"> 

                        <appendToFile value="true" /> 

                        <file value="Service.log" /> 

                        <layout type="log4net.Layout.PatternLayout"> 

                                <conversionPattern value="%date{dd-MM-yyyy HH:mm:ss,fff} %5level [%2thread] %message (%logger{1}:%line)%n" />

                          </layout> 

                        <rollingStyle value="Date" /> 

                        <Threshold value="DEBUG" /> 

                </appender>

                  <appender name="EvLog" type="log4net.Appender.EventLogAppender"> 

                        <ApplicationName value="IPserver" /> 

                        <layout type="log4net.Layout.PatternLayout"> 

                                <conversionPattern value="[%thread] %message (%logger{1})" /> 

                        </layout> 

                        <Threshold value="INFO" /> 

                </appender>

                  <root> 

                        <level value="DEBUG" /> 

                        <appender-ref ref="RollingFile" /> 

                        <appender-ref ref="Console" /> 

                        <appender-ref ref="EvLog" /> 

                </root> 

        </log4net>

  I tried to complete rewrite this config into C# code:

  private readonly log4net.Appender.ConsoleAppender AppConsole; 

private readonly log4net.Appender.RollingFileAppender AppFile; 

private readonly log4net.Appender.EventLogAppender AppEvlog; 

private log4net.Repository.Hierarchy.RootLogger rootLog; 

//XmlConfigurator.Configure(new System.IO.FileInfo(IPserverCore.IPserver.GetAppPath() + "log4net.config")); 

//xml configurator replaced by code 

AppConsole = new log4net.Appender.ConsoleAppender(); 

AppConsole.Layout = new log4net.Layout.PatternLayout("%date{HH:mm:ss,fff} %5level [%thread] %message%n"); 

AppConsole.Threshold = log4net.Core.Level.Debug;

  AppFile = new log4net.Appender.RollingFileAppender(); 

AppFile.AppendToFile = true; 

AppFile.Layout = new log4net.Layout.PatternLayout("%date{dd-MM-yyyy HH:mm:ss,fff} %5level [%2thread] %message (%logger{1}:%line)%n");

  AppFile.File = "Service.log"; 

AppFile.RollingStyle = log4net.Appender.RollingFileAppender.RollingMode.Date; 

AppFile.Threshold = log4net.Core.Level.Debug;

  AppEvlog = new log4net.Appender.EventLogAppender(); 

AppEvlog.Layout = new log4net.Layout.PatternLayout("[%thread] %message (%logger{1})"); 

AppEvlog.ApplicationName = "IPserver"; 

AppEvlog.Threshold = log4net.Core.Level.Info;

  rootLog = new log4net.Repository.Hierarchy.RootLogger(log4net.Core.Level.Info); 

                         

rootLog.AddAppender(AppConsole); 

rootLog.AddAppender(AppFile); 

rootLog.AddAppender(AppEvlog); 

//---- 

log = LogManager.GetLogger(typeof(IPservice)); 

Log.Info("Start"); // no log produced here... 

rootLog.RemoveAppender(AppFile); // disable file logging 

... 

But after rewriting aplication doesn't create any logs.... 

Did I miss some settings or am I complete wrong?

  Thanks for any suggestions 

Radovan Raszka