我正在重新编写现有的日志系统来使用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?
答案 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;