如何访问现有的NLog MemoryTarget

时间:2014-08-22 20:22:01

标签: 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="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?

3 个答案:

答案 0 :(得分:2)

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

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];
    //...
}

答案 1 :(得分:1)

这样的事情:

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

您可以选择将收到的目标投射到MemoryTarget类型。

答案 2 :(得分:0)

我只需要自己做:

本地:

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

或使用演员表:

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