由于我有一个全局异常处理程序,通过电子邮件报告未捕获的错误,下一步是通过收集大约10-20条最后一行日志来添加一些上下文。
所以我这样使用MemoryTarget
:
MemoryTarget _logTarget;
_logTarget = new MemoryTarget();
_logTarget.Layout = "${longdate}|${level:uppercase=true}|${logger}|${message}${exception}";
LoggingRule loggingRule = new LoggingRule("*", LogLevel.Debug, _logTarget);
LogManager.Configuration.AddTarget("exceptionMemory", _logTarget);
LogManager.Configuration.LoggingRules.Add(loggingRule);
LogManager.Configuration.Reload();
包含此内容的应用程序应该永远运行,如果我将日志保留在内存中,未经检查,我将整齐地设计内存泄漏。
如何解决这个问题?如何截断MemoryTarget.Logs
最多说100行?
答案 0 :(得分:3)
你最好的选择可能是编写你自己的MemoryTarget ......这样的东西(未经测试)应该有效。
namespace NLog.Targets
{
using System.Collections.Generic;
[Target("LimitedMemory")]
public sealed class LimitedMemoryTarget : TargetWithLayout
{
private Queue<string> logs = new Queue<string>();
public LimitedMemoryTarget()
{
this.Logs = new List<string>();
}
public IEnumerable<string> Logs
{
get { return logs; }
private set { logs = value; }
}
[DefaultValue(100)]
public int Limit { get; set; }
protected override void Write(LogEventInfo logEvent)
{
string msg = this.Layout.Render(logEvent);
logs.Enqueue(msg);
if (logs.Count > Limit)
{
logs.Dequeue();
}
}
}
}
此示例基于NLog MemoryTarget,您可以在此处找到源代码:
NLog文档在这里:
http://nlog-project.org/documentation/v2.0.1/
我在任何一个地方都没有看到你问的任何事情。