gpt4 book ai didi

log4net - 在 NServiceBus 初始化中为 Log4Net 设置 BufferSize

转载 作者:行者123 更新时间:2023-12-02 00:24:13 25 4
gpt4 key购买 nike

在我的应用程序中配置 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";
})

我想移除用于测试的缓冲(通过设置 BufferSize = 1)

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

最佳答案

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

实际上,在 log4net 代码库中进行探索,看起来您可以控制 FileAppender 使用的缓冲区大小的唯一方法是编写您自己的 LockingModelBase 实现。 log4net 附带的那些实现,即 ExclusiveLockMinimalLock,在内部使用 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();
})

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 - 在 NServiceBus 初始化中为 Log4Net 设置 BufferSize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9522773/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com