NLog MemoryTarget最大大小

时间:2013-11-11 21:59:02

标签: nlog

由于我有一个全局异常处理程序,通过电子邮件报告未捕获的错误,下一步是通过收集大约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行?

1 个答案:

答案 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,您可以在此处找到源代码:

https://github.com/NLog/NLog

NLog文档在这里:

http://nlog-project.org/documentation/v2.0.1/

我在任何一个地方都没有看到你问的任何事情。