logging-log4net-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Shaily Goel" <gsha...@novell.com>
Subject RE: Rolling Based on Size not working
Date Wed, 31 Aug 2005 06:36:07 GMT
hi
 
I have found that the problem is with LayOut. I made my own layOut
called as "MineSimpleLayout". For testing this LayOut just writes one
constant string.
It is implemented in following way:
 
 public class MineSimpleLayout:  LayoutSkeleton
    {
                
        public MineSimpleLayout()
        {
            this.IgnoresException = true;
        }
 
        override public void ActivateOptions() 
        {
            // nothing to do.
        }
 
         override public void Format(TextWriter writer, LoggingEvent
loggingEvent) 
        {
           
       
            string formatString = null;
            if(loggingEvent == null)
            {
                  return;
            }
            formatString = "Test Message LayOut";
            writer.WriteLine(formatString);                            
        
        }
}
 
Results: I found that if  I associate RollingFileAppender to
"MineSimpleLayout" it does not roll the file. It go on writing to single
file and value of variable "((CountingQuietTextWriter)QuietWriter).Count
 " is never changed.
My idea is that  the  above "Format method" automatically close the
writer Object. So the Property
"((CountingQuietTextWriter)QuietWriter).Count"  always shows 0. But If I
add the following line of code to Format method "
loggingEvent.WriteRenderedMessage(writer);" then it works properly.

I do not want to do "loggingEvent.WriteRenderedMessage" as in practical
scenario my logging event will be some "object" and not string and so I
do not want to write RenderedMessage to Writer.
 
My requirement is : I want to make "CustomLayOut" which reads the
LoggingEvent Object . Extract various property values from it. Make the
Formatted String and write that string to File.
 
Please help me in making such kind of layOut and  associating that
LayOut with RollingFileAppender.
 
Thanks
Shaily
 
 
 
 
>>> nicko@neoworks.com 08/30/05 8:44 PM >>>

Shaily,

I have tried to reproduce your situation using the code you supplied,
however it is working correctly for me. The files are size rolled at
just over 1KB in size. The exact code I am running is below. The only
significant change I have made is to use the SimpleLayout as I don't
have a copy of your MineSimpleLayout class.

This functionality should work OK with log4net 1.2.9.

Nicko


private static void ShailyGoel_Main()
{
  ILog logger = LogManager.GetLogger("TestLogger");
  log4net.Repository.Hierarchy.Logger log = logger.Logger as
log4net.Repository.Hierarchy.Logger;
  log.Level = Level.Info;
  log.Additivity = false;
  log.Repository.Configured = true; 
  log.AddAppender(ShailyGoel_CreateRollingFileAppender());

  logger.Error("This is test message: ");
  for(int i = 0; i<= 10000; i++)
  {
    logger.Error("This is new test message: " );
  }
}

private static RollingFileAppender
ShailyGoel_CreateRollingFileAppender()
{
  RollingFileAppender appender = new RollingFileAppender();

  appender.Name = "CustomRoller";
  appender.File = "C:\\tmp\\roller.txt";
  appender.AppendToFile = true;           
  appender.RollingStyle = RollingFileAppender.RollingMode.Size;

  appender.MaxSizeRollBackups = 5;
  appender.MaximumFileSize = "1KB";
  SimpleLayout layOut = new SimpleLayout();
  appender.Layout = layOut;
  appender.StaticLogFileName = true;
  appender.ActivateOptions();

  return appender;
} 

> -----Original Message-----
> From: Shaily Goel [mailto:gshaily@novell.com] 
> Sent: 30 August 2005 14:10
> To: log4net-user@logging.apache.org; Nicko Cadell
> Subject: Rolling Based on Size not working
> 
> hi
>  
> I am facing the following problem while using RollingFileAppender:
> version of Log4net used: incubating-log4net-1.2.9-beta ; 
> Platform: Windows 
> 
> Following is the code which I am running:
>  
> class TestRollingFileAppender
>  {
>   /// <summary>
>   /// The main entry point for the application.
>   /// </summary>
>   [STAThread]
>   static void Main(string[] args)
>   {
>             log4net_Logger log = 
> LogManager.GetLogger("TestLogger").Logger as log4net_Logger;
>             log.Level = Level.Info;
>             log.Additivity = false;
>             log.Repository.Configured = true; 
>             log.AddAppender(CreateRollingFileAppender());
>             ILog logger = LogManager.GetLogger("TestLogger");
>             logger.Error("This is test message: ");
>             for(int i = 0; i<= 10000; i++)
>             {
>                 logger.Error("This is new test message: " );
>             }
>  
>   }
>  
>         private static RollingFileAppender
CreateRollingFileAppender()
>         {
>            RollingFileAppender appender = new RollingFileAppender();
>             MineSimpleLayout layOut = new MineSimpleLayout();
>             appender.Name = "CustomRoller";
>             appender.File = "C:\\TestFolder\\Roll\\roller.txt";
>             appender.AppendToFile = true;           
>             appender.RollingStyle = 
> RollingFileAppender.RollingMode.Size;            
>                appender.MaxSizeRollBackups = 5;
>              appender.MaximumFileSize = "1KB";
>                 appender.Layout = layOut;
>                appender.StaticLogFileName = true;
>             appender.ActivateOptions();    
>             return appender;
>         }
>         
>  
>  }
>  
> Scenario 1: No Log File is existing: Running the application 
> for the first time:
>  
> I saw that when I ran my application for the first time, the 
> rolling file appender does not roll the logs. It goes on 
> appending the logs in current File (even when FileSize 
> exceeds the  MaximumFileSize i.e. 1 KB in above case)
>  
> I digged into the code of Log4net.RollingFileAppender and 
> found that it is never going into the method RollOverSize().
> The following condition in Append method:
> if ((File != null) && 
> ((CountingQuietTextWriter)QuietWriter).Count >= m_maxFileSize) 
>     {
>      RollOverSize();
>     }
> 
> always returns false.
>  
> I checked the value of 
> ((CountingQuietTextWriter)QuietWriter).Count . It is 0 for 
> every Log message. This means that value of 
> ((CountingQuietTextWriter)QuietWriter).Count  is not 
> increasing as the messages are getting appended in file and 
> file size increasing.
>  
> Scenario 2: When the Log File is already existing
>  
> I found that at the start it checks the size of already 
> existing file and properly set the value of 
> ((CountingQuietTextWriter)QuietWriter).Count equal to FileSize.
> Now when the message is logged and if  the value of  
> ((CountingQuietTextWriter)QuietWriter).Count is greater then 
> m_maxFileSize  the File is rolled properly and 
> (CountingQuietTextWriter)QuietWriter).Count  is again set to 
> "0". Now The new messages are being written into the current 
> file but as ((CountingQuietTextWriter)QuietWriter).Count  is 
> never increasing so "No" Rolls takes place after that.
>  
> Conclusion : ((CountingQuietTextWriter)QuietWriter).Count  is 
> only set at initial time of application. After that it never 
> increments as the size of file grows.
>  
> My requirement is as the FileSize grows above the particular 
> limit the Roll of file should be taken.
>  
> Please let me know if this is bug in Log4net or I am missing 
> some thing.
>  
> Thanks
> Shaily
> 
>  
> 
> 


Mime
View raw message