Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何访问现有NLog MemoryTarget_C#_.net_Nlog - Fatal编程技术网

C# 如何访问现有NLog MemoryTarget

C# 如何访问现有NLog MemoryTarget,c#,.net,nlog,C#,.net,Nlog,我正在改造一个现有的日志系统,改为使用NLog。我已在配置文件中手动添加了对NLog的引用: <targets> <target xsi:type="File" name="fileLogger" fileName="${basedir}\TRACE\${date:format=yyyy-MM-dd}.log" layout="TimeStamp:[${date}]|${message}" /> <target xsi:type="Memory" name=

我正在改造一个现有的日志系统,改为使用NLog。我已在配置文件中手动添加了对NLog的引用:

<targets>
  <target xsi:type="File" name="fileLogger" fileName="${basedir}\TRACE\${date:format=yyyy-MM-dd}.log" layout="TimeStamp:[${date}]|${message}" />
  <target xsi:type="Memory" name="MemLogger" layout="TimeStamp:[${date}]|${message}|${Type}" />
</targets>
<rules>
  <logger name="ApplicationLogger" levels="Info,Warn,Error" writeTo="fileLogger" />
  <logger name="ApplicationLogger" levels="Info,Warn,Error" writeTo="fileLogger" />
</rules>

我想做的是在代码中拉出MemLogger日志并访问不同的部分(类型、消息、时间戳)。我将如何做到这一点?我已经了解了如何从头开始创建新日志,但我不想创建新的memorytarget,我想访问配置中的现有日志,从中提取日志数据,然后清除内存(这样我就不会出现内存泄漏)

如何在C#?

中访问MemLogger MemoryTarget,如下所示:

var target = LogManager.Configuration.FindTargetByName("MemLogger");

或者,您可以将接收到的目标强制转换为
MemoryTarget
类型。

不幸的是,您无法访问日志的不同部分。日志存储为渲染字符串,所有布局渲染器都已替换为其值。您所能做的就是手动解析每个日志字符串。例如

var target =(MemoryTarget)LogManager.Configuration.FindTargetByName("MemLogger");

foreach (string log in target.Logs)
{
    var parts = log.Split('|');
    var date = parts[0].Replace("TimeStamp:[", "").TrimEnd(']');
    var message = parts[1];
    var type = parts[2];
    //...
}

我必须自己做这件事:

本机:

IList<string> logs = LogManager.Configuration.FindTargetByName<MemoryTarget>("MyTarget").Logs;
IList logs=LogManager.Configuration.FindTargetByName(“MyTarget”).logs;
或使用石膏:

IList<string> logs = ((MemoryTarget)LogManager.Configuration.FindTargetByName("MyTarget")).Logs;
IList logs=((MemoryTarget)LogManager.Configuration.FindTargetByName(“MyTarget”)).logs;

这工作正常,但现在我有一个新问题。如何从“MemLogger”中删除消息?如果我使用target.Clear(),它只会清除目标实例,而不会清除MemLogger本身,因此当我让我的应用程序打开太长时间时,就会出现内存泄漏。如何清除实际的MemLogger日志以防止内存泄漏?@Fuzzerker logger保存对其配置为写入的目标实例的引用。记录器不保存任何消息。它只是将日志事件写入所有目标。如果清除内存目标中的消息,则这些消息将消失,并且不会存储在其他位置。使用一些探查器查找内存泄漏的位置(我喜欢Ants探查器)