在NServiceBus初始化中为Log4Net设置缓冲区大小

在NServiceBus初始化中为Log4Net设置缓冲区大小,log4net,nservicebus,Log4net,Nservicebus,在我的应用程序中配置NServiceBus时,我将Log4Net设置为使用RollingFileAppender: .Log4Net<RollingFileAppender>(x=> { x.AppendToFile = true; x.Threshold = Level.Debug; x.MaxSizeRollBackups = 10; x.Ro

在我的应用程序中配置NServiceBus时,我将Log4Net设置为使用
RollingFileAppender

 .Log4Net<RollingFileAppender>(x=>
         {
              x.AppendToFile = true;
              x.Threshold = Level.Debug;
              x.MaxSizeRollBackups = 10;
              x.RollingStyle = RollingFileAppender.RollingMode.Size;
              x.File = "c:\\Logs\\log.txt";
          })
.Log4Net(x=>
{
x、 AppendToFile=true;
x、 阈值=Level.Debug;
x、 MaxSizerollBackup=10;
x、 RollingStyle=RollingFileAppender.RollingMode.Size;
x、 File=“c:\\Logs\\log.txt”;
})
我想删除用于测试的缓冲(通过设置
BufferSize=1


当使用
.Log4Net()
扩展时,这可能吗?

Log4Net
FileAppender
类不提供
BufferSize
属性,因此您无法直接在配置中或使用该扩展方法设置它。(此属性仅由
BufferingAppenderSkeleton
基类公开,但它不是
FileAppender
类的基类)

实际上,在log4net代码库中,似乎控制
FileAppender
使用的缓冲区大小的唯一方法是编写自己的
LockingModelBase
实现。log4net附带的那些实现,即
ExclusiveLock
MinimalLock
,在内部使用
FileStream
构造函数,该构造函数使用默认缓冲区大小0x1000,即4096

话虽如此,您或许可以这样做:

.Log4Net<RollingFileAppender>(x=>
     {
          x.AppendToFile = true;
          x.Threshold = Level.Debug;
          x.MaxSizeRollBackups = 10;
          x.RollingStyle = RollingFileAppender.RollingMode.Size;
          x.File = "c:\\Logs\\log.txt";
          x.LockingModel = new MyUnbufferedLockingModel();
      })
 public class MyUnbufferedLockingModel : log4net.FileAppender.LockingModelBase
 {
    // This is essentially a rip-off of the default 'ExclusiveLock' class,
    // but when creating the "m_stream", using an explicit buffer size of 1.
    // Depending on your needs you may want to use the 'MinimalLock' class
    // instead.

    private Stream m_stream = null;

    public override Stream AcquireLock()
    {
       return m_stream;
    }  

    public override void CloseFile()
    {
       using (CurrentAppender.SecurityContext.Impersonate(this))
       {
          m_stream.Close();
       }
    }

    public override void OpenFile(string filename, bool append, Encoding encoding)
    {
       try
       {
           using (CurrentAppender.SecurityContext.Impersonate(this))
           {
               string directoryName = Path.GetDirectoryName(filename);
               if (!Directory.Exists(directoryName))
               {
                  Directory.CreateDirectory(directoryName);
               }
               FileMode mode = append ? FileMode.Append : FileMode.Create;
               m_stream = new FileStream(filename, mode, FileAccess.Write,     
                  FileShare.Read,
                  1 /*BufferSize*/);
           }
        }
        catch (Exception exception)
        {
            CurrentAppender.ErrorHandler.Error("Unable to acquire lock on file " + filename + ". " + exception.Message);
        }
    }

    public override void ReleaseLock()
    {
    }
 }
.Log4Net<RollingFileAppender>(x=>
         {
              x.LockingModel = new FileAppender.MinimalLock();
              x.Threshold = Level.Debug;
              x.MaxSizeRollBackups = 10;
              x.RollingStyle = RollingFileAppender.RollingMode.Size;
              x.File = "c:\\Logs\\log.txt";
          })

最后,缓冲不是问题所在,解决方案非常简单。看起来RollingFileAppender在默认情况下使用独占锁,因此在应用程序运行时日志文件被锁定

此实例中的修复是设置:
LockingModel=newfileappender.MinimalLock()

更新后的init如下所示:

.Log4Net<RollingFileAppender>(x=>
     {
          x.AppendToFile = true;
          x.Threshold = Level.Debug;
          x.MaxSizeRollBackups = 10;
          x.RollingStyle = RollingFileAppender.RollingMode.Size;
          x.File = "c:\\Logs\\log.txt";
          x.LockingModel = new MyUnbufferedLockingModel();
      })
 public class MyUnbufferedLockingModel : log4net.FileAppender.LockingModelBase
 {
    // This is essentially a rip-off of the default 'ExclusiveLock' class,
    // but when creating the "m_stream", using an explicit buffer size of 1.
    // Depending on your needs you may want to use the 'MinimalLock' class
    // instead.

    private Stream m_stream = null;

    public override Stream AcquireLock()
    {
       return m_stream;
    }  

    public override void CloseFile()
    {
       using (CurrentAppender.SecurityContext.Impersonate(this))
       {
          m_stream.Close();
       }
    }

    public override void OpenFile(string filename, bool append, Encoding encoding)
    {
       try
       {
           using (CurrentAppender.SecurityContext.Impersonate(this))
           {
               string directoryName = Path.GetDirectoryName(filename);
               if (!Directory.Exists(directoryName))
               {
                  Directory.CreateDirectory(directoryName);
               }
               FileMode mode = append ? FileMode.Append : FileMode.Create;
               m_stream = new FileStream(filename, mode, FileAccess.Write,     
                  FileShare.Read,
                  1 /*BufferSize*/);
           }
        }
        catch (Exception exception)
        {
            CurrentAppender.ErrorHandler.Error("Unable to acquire lock on file " + filename + ". " + exception.Message);
        }
    }

    public override void ReleaseLock()
    {
    }
 }
.Log4Net<RollingFileAppender>(x=>
         {
              x.LockingModel = new FileAppender.MinimalLock();
              x.Threshold = Level.Debug;
              x.MaxSizeRollBackups = 10;
              x.RollingStyle = RollingFileAppender.RollingMode.Size;
              x.File = "c:\\Logs\\log.txt";
          })
.Log4Net(x=>
{
x、 LockingModel=newFileAppender.MinimalLock();
x、 阈值=Level.Debug;
x、 MaxSizerollBackup=10;
x、 RollingStyle=RollingFileAppender.RollingMode.Size;
x、 File=“c:\\Logs\\log.txt”;
})
当我在Log4Net文档中搜索缓冲解决方案时,我偶然发现了。此附加器包装提供缓冲服务的非缓冲附加器

如果我想向RollingFileAppender添加缓冲,那么配置将是这样的:

  .Log4Net<BufferingForwardingAppender>
                (x =>
                     {
                         x.BufferSize = 50; // number of events to buffer                             
                         x.AddAppender(new RollingFileAppender()
                                           {
                                               LockingModel = new FileAppender.MinimalLock(),
                                               Layout = new SimpleLayout(),
                                               Threshold = Level.Debug,
                                               MaxSizeRollBackups = 10,
                                               RollingStyle = RollingFileAppender.RollingMode.Size,
                                               File = "c:\\Logs\\log.txt",
                                               SecurityContext = NullSecurityContext.Instance
                                           });

                     })
.Log4Net
(x=>
{
x、 BufferSize=50;//要缓冲的事件数
x、 AddAppender(新的RollingFileAppender()
{
LockingModel=new FileAppender.MinimalLock(),
布局=新的SimpleLayout(),
阈值=Level.Debug,
MaxSizerollBackup=10,
RollingStyle=RollingFileAppender.RollingMode.Size,
File=“c:\\Logs\\log.txt”,
SecurityContext=NullSecurityContext.Instance
});
})

帕特里克。

谢谢你创造性的回答。你最终让我找到了答案,所以我会相信你。我还将用我的工作解决方案为这个问题创建另一个答案。谢谢:-)然后你也应该接受你自己的答案作为正确答案。