如何访问现有的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 ?
不幸的是,您无法访问日志的不同部分。日志存储为渲染字符串,所有布局渲染器都已被其值替换。您所能做的就是手动解析每个日志字符串。例如
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;