gpt4 book ai didi

.net - log4net - 任何只记录第 N 条消息的过滤器?

转载 作者:行者123 更新时间:2023-12-04 06:00:33 25 4
gpt4 key购买 nike

我有一个不断从设备读取值的组件。目前,它每 {n} 秒更新一次,并将带有该值的调试消息记录到 ILog 的实例中。

每一秒对我来说都太频繁了,我只是不在乎,它占用了太多的日志空间。但是,我肯定会对从该组件中捕获每 10 条或 30 条消息感兴趣,这样我就可以了解它正在做什么的一般要点。

有没有人知道任何不涉及我自己的 ILog 实现的方法?

最佳答案

这可能为时已晚,无法帮助您,但您可以实现过滤器。 http://www.mail-archive.com/log4net-user%40logging.apache.org/msg02517.html展示了如何实现过滤器来限制记录异常的频率(如果异常类型与上一个异常类型相同,并且所耗时少于指定的时间量)。

这是该链接中的实际过滤器源代码:

public class ExceptionThrottleFilter : FilterSkeleton
{
private DateTime lastException = DateTime.MinValue;
private Type exceptionType = typeof(Exception);
private int threshold = 5; // seconds

public override void ActivateOptions()
{
base.ActivateOptions();
}

public override FilterDecision Decide(LoggingEvent loggingEvent)
{
if (loggingEvent.ExceptionObject != null && loggingEvent.ExceptionObject.GetType) == exceptionType)
{
if (loggingEvent.TimeStamp.Subtract(lastException).TotalSeconds > threshold)
{
lastException = loggingEvent.TimeStamp;
return FilterDecision.Accept;
}
else
{
return FilterDecision.Deny;
}
}
else
{
return FilterDecision.Neutral;
}
}

public Type ExceptionType
{
get { return exceptionType; }
set { exceptionType = value; }
}

public int Threshold
{
get { return threshold; }
set { threshold = value; }
}
}

它会像这样配置:
<filter type="Company.Project.Logging.ExceptionThrottleFilter">
<threshold value="2" />
<exceptionType value="System.ApplicationException" />
</filter>

将其修改为“限制”重复的消息似乎非常简单。也许是这样的(未经测试):
public class DuplicateMessageThrottleFilter : FilterSkeleton
{
private string lastMessage;

public override void ActivateOptions()
{
base.ActivateOptions();
}

public override FilterDecision Decide(LoggingEvent loggingEvent)
{
string newMessage;
if (loggingEvent.MessageObject != null)
{
newMessage = loggingEvent.MessageObject.ToString();
}

if (newMessage.Equals(lastMessage))
{
return FilterDecision.Deny;
}

lastMessage = newMessage;
return FilterDecision.Accept;
}
}

用重复的次数来注释记录的消息可能会很好,但是如何做到这一点对我来说并不明显:
Some message.
Some message.
Some message.
Look, a new message.
Some message.
Some message.
Look, a new message.

可以生成这样的东西:
Some message. (3 times)
Look, a new message.
Some message. (2 times)
Look, a new message.

可能是某种 ForwardingAppender 或 BufferingForwardingAppender。这将永远是一个消息。一条消息进来了。“RepeatedMessageAppender”将保存该消息。下一条消息进来。如果它与上一条消息不同,则将上一条消息转发到“真实”Appender(如果“重复计数”> 0,则在转发前将数字附加到最后一条消息 - 这就是我的部分不确定,因为我认为修改传递给 Appender 的 LoggingEvent 并不容易)。如果与上一条消息相同,则增加计数器,不转发。由于“RepeatedMessageAppender”是一个落后的,它可能必须是一个BufferingForwardingAppender并且它必须实现Flush。

也许您(或其他人)会发现这些信息很有用。

关于.net - log4net - 任何只记录第 N 条消息的过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1208541/

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