- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 log4net
并且我已经从 AdoNetAppender
创建了我自己的 appender。我的 appender 只是实现了一种缓冲区,它允许在一个日志中对相同的事件进行分组(对于数千个相同的错误,我将在数据库中只有一行)。
为了便于理解,这里是代码(我的 appender 有一个 buffersize = 1):
class CustomAdoNetAppender : AdoNetAppender
{
//My Custom Buffer
private static List<LoggingEvent> unSendEvents = new List<LoggingEvent>();
private int customBufferSize = 5;
private double interval = 100;
private static DateTime lastSendTime = DateTime.Now;
protected override void SendBuffer(log4net.Core.LoggingEvent[] events)
{
LoggingEvent loggingEvent = events[0];
LoggingEvent l = unSendEvents.Find(delegate(LoggingEvent logg) { return GetKey(logg).Equals(GetKey(loggingEvent), StringComparison.OrdinalIgnoreCase); });
//If the events already exist in the custom buffer (unSendEvents) containing the 5 last events
if (l != null)
{
//Iterate the count property
try
{
l.Properties["Count"] = (int)l.Properties["Count"] + 1;
}
catch
{
l.Properties["Count"] = 1;
}
}
//Else
else
{
//If the custom buffer (unSendEvents) contains 5 events
if (unSendEvents.Count() == customBufferSize)
{
//Persist the older event
base.SendBuffer(new LoggingEvent[] { unSendEvents.ElementAt(0) });
//Delete it from the buffer
unSendEvents.RemoveAt(0);
}
//Set count properties to 1
loggingEvent.Properties["Count"] = 1;
//Add the event to the pre-buffer
unSendEvents.Add(loggingEvent);
}
//If timer is over
TimeSpan timeElapsed = loggingEvent.TimeStamp - lastSendTime;
if (timeElapsed.TotalSeconds > interval)
{
//Persist all events contained in the unSendEvents buffer
base.SendBuffer(unSendEvents.ToArray());
//Update send time
lastSendTime = unSendEvents.ElementAt(unSendEvents.Count() - 1).TimeStamp;
//Flush the buffer
unSendEvents.Clear();
}
}
/// <summary>
/// Function to build a key (aggregation of important properties of a logging event) to facilitate comparison.
/// </summary>
/// <param name="logg">The loggign event to get the key.</param>
/// <returns>Formatted string representing the log event key.</returns>
private string GetKey(LoggingEvent logg)
{
return string.Format("{0}|{1}|{2}|{3}", logg.Properties["ErrorCode"] == null ? string.Empty : logg.Properties["ErrorCode"].ToString()
, logg.Level.ToString()
, logg.LoggerName
, logg.MessageObject.ToString()
);
}
}
缓冲和计数部分进展顺利。我的问题是我丢失了最后 5 个日志,因为缓冲区在程序结束时没有刷新。 unSendEvent 缓冲区已满但从未在数据库中刷新,因为没有更多新日志将“推送”到数据库旧日志中。
我有什么解决方案吗?我尝试使用 Flush() 方法但没有成功。
最佳答案
Smtp appender 有一个有损参数。如果它未设置为 false,则不能保证获得所有日志消息。听起来这可能是你的问题?我使用配置文件,所以这一行在我的 appender 定义中。
<lossy value="false" />
关于c# - Log4Net 自定义 AdoNetAppender 缓冲区问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5884137/
我正在尝试使用 Log4Net 将异常记录到数据库中。我正在使用 adonetappender,它确实有效,但不是最佳状态。 如果我这样配置异常参数...
我正在使用 log4net 并尝试使用 AdoNetAppender 将自定义 DateTime 属性传递给数据库。我可以很好地传入 DateTime 值,但数据库值不包括毫秒。最终值四舍五入到最接近
我有一个像这样的 AdoNetAppender 设置:
我想使用 Log4NET 登录我的数据库,按照一些教程,我发现我必须为 DAO appender 配置一个连接字符串。 我的 web.config 中已经有一个用于数据库连接的连接字符串,所以我想知道
我可以使用 ADONetAppender 设置 log4NET,当我想通过 log.Info(message) 记录消息时捕获事物的状态时,一切正常。 由于我将根据在整个应用程序中发生变化的 Acti
我有一个库,其中有几个 Web 服务调用。现在需要记录对外部 Web 服务发出的所有请求并记录收到的所有响应。这是以后内部审计用的。 我的 sql 表看起来像这样。 CREATE TABLE [dbo
我正在使用 ADONetAppender 来(尝试)通过存储过程记录数据(以便我可以将逻辑注入(inject)到日志记录例程中)。 我的配置设置如下所示。谁能告诉我做错了什么?
我在 log4net.config 文件中定义了一个记录器,该文件应该使用 AdoNetAppender 记录到 SQL Server 2005 的实例。在我的代码中调用该记录器,但没有记录任何消息,
我正在使用 log4net 并且我已经从 AdoNetAppender 创建了我自己的 appender。我的 appender 只是实现了一种缓冲区,它允许在一个日志中对相同的事件进行分组(对于数千
在我的一个项目中我遇到了这个错误: System.IndexOutOfRangeException: SqlParameterCollection does not contain SqlParame
我在网络应用程序中使用 log4net,并将所有页面错误记录到 SQL 服务器。我想知道是否有任何方法可以检索它生成的条目 ID。我要离开这里找到的文档 http://logging.apache.o
我想加密 log4net 使用的连接字符串 AdoNetAppender . 这可以在不加密整个 appender 的情况下完成吗? Dion Olsthoorn关于在代码中设置连接字符串的博客,但我
我正在使用 Log4Net 自定义属性将一些环境信息添加到我的日志中。我创建了一个具有全局可访问属性的实用程序类,我的程序类使用这些属性来存储上下文信息(订单 ID、用户 ID 等)和它们周围的惰性包
有一个 asp.net、dot net 4 网络应用程序,使用 log4net 进行日志记录。我们记录到 Windows 事件日志和 Oracle 11g 表。除了Application_Start之
我的 ASP.NET Core 应用程序 (netcoreapp1.1) 中的 log4net 的 AdoNetAppender 有问题。 如果我想使用 AdoNetAppender,我会收到以下错误
我将 Log4Net 与 AdoNetAppender 结合使用,我喜欢在特定时间或时间段内刷新缓冲区。 也许我没看错,Log4Net 不提供此功能,为此我必须创建自己的 Appender,但我不知道
我的 .net 3.5 应用程序上有一个 log4net 日志。日志记录正在插入数据库。我遇到的一个问题是,对于我没有设置数据的数据库,它插入“NULL”而不是数据库 null。我的配置是
描述 我的程序集中有一个配置文件作为资源,我想在我的应用程序中以编程方式更改 ConnectionString。 我使用 log4net.Config.XmlConfigurator.Configur
我在我的 asp.net 应用程序中使用 AdoNetAppender(SQL 服务器),并且希望使用 RollingFileAppender 以防万一与 SQL 出现任何连接问题。只有当 AdoNe
我正在尝试使用 log4net 的内置 adonetappender 登录到我的 redshift 服务器。删除时间戳字段后,日志将成功保存。但是,时间戳的格式似乎导致它失败。我已经尝试过许多与 re
我是一名优秀的程序员,十分优秀!