3

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

4

1 回答 1

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/

我在这两个地方都没有看到你问的任何东西。

于 2013-11-11T22:24:03.870 回答