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 に答える