C# Log4Net自定义AdoNetAppender缓冲区问题

C# Log4Net自定义AdoNetAppender缓冲区问题,c#,log4net,C#,Log4net,我使用的是log4net,我已经从AdoNetAppender创建了自己的appender。我的appender只是实现了一种缓冲区,它允许将相同的事件分组到一个日志中(对于数千个相同的错误,我在数据库中只有一行) 以下是易于理解的代码(我的appender的buffersize=1): 类CustomAdoNetAppender:AdoNetAppender { //我的自定义缓冲区 private static List unSendEvents=new List(); 私有int cust

我使用的是
log4net
,我已经从
AdoNetAppender
创建了自己的appender。我的appender只是实现了一种缓冲区,它允许将相同的事件分组到一个日志中(对于数千个相同的错误,我在数据库中只有一行)

以下是易于理解的代码(我的appender的buffersize=1):

类CustomAdoNetAppender:AdoNetAppender
{
//我的自定义缓冲区
private static List unSendEvents=new List();
私有int customBufferSize=5;
专用双间隔=100;
private static DateTime lastSendTime=DateTime.Now;
受保护的重写void SendBuffer(log4net.Core.LoggingEvent[]事件)
{
LoggingEvent LoggingEvent=事件[0];
LoggingEvent l=unsendeEvents.Find(委托(LoggingEvent logg){返回GetKey(logg).Equals(GetKey(LoggingEvent),StringComparison.OrdinalIgnoreCase);});
//如果事件已存在于包含最后5个事件的自定义缓冲区(未发送事件)中
如果(l!=null)
{
//迭代count属性
尝试
{
l、 属性[“计数”]=(int)l.属性[“计数”]+1;
}
接住
{
l、 属性[“计数”]=1;
}
}
//否则
其他的
{
//如果自定义缓冲区(未发送事件)包含5个事件
if(unSendEvents.Count()==customBufferSize)
{
//保留旧事件
base.SendBuffer(新的LoggingEvent[]{unSendEvents.ElementAt(0)});
//从缓冲区中删除它
未检测事件。移除(0);
}
//将计数属性设置为1
loggingEvent.Properties[“Count”]=1;
//将事件添加到预缓冲区
未检测事件。添加(记录事件);
}
//如果计时器结束
TimeSpan TimeAppeased=loggingEvent.TimeStamp-lastSendTime;
if(timeappeased.TotalSeconds>间隔)
{
//保留未发送事件缓冲区中包含的所有事件
base.SendBuffer(unSendEvents.ToArray());
//更新发送时间
lastSendTime=unSendEvents.ElementAt(unSendEvents.Count()-1).TimeStamp;
//刷新缓冲区
未检测事件。清除();
}
}
/// 
///函数生成一个键(日志事件的重要属性的聚合)以便于比较。
/// 
///loggign事件以获取密钥。
///表示日志事件键的格式化字符串。
私有字符串GetKey(LoggingEvent logg)
{
返回string.Format(“{0}{1}{1}{2}}{3}”,logg.Properties[“ErrorCode”]==null?string.Empty:logg.Properties[“ErrorCode”].ToString()
,logg.Level.ToString()
,logg.LoggerName
,logg.MessageObject.ToString()
);
}
}
缓冲区和计数部分运行良好。我的问题是,我丢失了最后5个日志,因为缓冲区在程序结束时没有刷新。unSendEvent缓冲区已满,但从未在数据库中刷新,因为不再有新日志将“推送”到db旧日志中


有什么解决办法吗?我尝试使用Flush()方法,但没有成功。

Smtp追加器有一个有损参数。如果未设置为false,则不能保证获得所有日志消息。听起来可能是你的问题吧?我使用一个配置文件,所以这一行在我的appender定义中

<lossy value="false" />

Smtp追加器有一个有损参数。如果未设置为false,则不能保证获得所有日志消息。听起来可能是你的问题吧?我使用一个配置文件,所以这一行在我的appender定义中

<lossy value="false" />


我可以想出几种方法来处理这个问题。首先是将缓冲区大小更改为1(现在是5)。这将确保立即写入所有条目。然而,这可能并不理想。如果是这样的话,我能想到的一个解决办法是将五条虚拟日志消息放入缓冲区。这将清除真实事件,而您的虚拟事件将被删除。

我可以想出几种方法来处理此问题。首先是将缓冲区大小更改为1(现在是5)。这将确保立即写入所有条目。然而,这可能并不理想。如果是这样的话,我能想到的一个解决办法是将五条虚拟日志消息放入缓冲区。这将清除真实事件,而您的虚拟事件将是被删除的事件。

我使用的是adonetappender,而不是smtp,但是是的,我将lossy值设置为false。可能是因为我的LoggingEvent列表没有被检测为缓冲区?@Xavier这解决了你的问题吗?还没有。是否可以访问AdoNetAppender缓冲区中的事件?我使用的是AdoNetAppender,而不是smtp,但是是的,我将lossy值设置为false。可能是因为我的LoggingEvent列表没有被检测为缓冲区?@Xavier这解决了你的问题吗?还没有。是否可以访问AdoNetAppender缓冲区中的事件?我的缓冲区大小实际上是一个。这里的问题是因为我自己管理缓冲。记录5个假事件的问题是,appHmmm没有“真正的终点”。我以前从未手动管理过缓冲区。听起来缓冲区并没有调整到只有1。在顶部,您将缓冲区设置为5(private int bufferSize=5;)。这可能是因为之后它没有调整到1吗?我的appender的缓冲区大小等于1。我手动管理一个大小为5的缓冲区(为了更清楚,私有int bufferSize=5现在是manualBufferSize=5)。我现在的问题是:是否可以访问CustomAdoNetApp