如何访问现有的NLog MemoryTarget

本文关键字:NLog MemoryTarget 何访问 访问 | 更新日期: 2023-09-27 18:19:06

我正在重新设计一个现有的日志系统,使用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 ?

如何访问现有的NLog 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];
    //...
}

像这样:

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

可选地,您可以将接收到的目标转换为MemoryTarget类型。

我不得不自己做这件事:

本机

:

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

或使用Cast:

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