C# 如何访问现有NLog MemoryTarget
我正在改造一个现有的日志系统,改为使用NLog。我已在配置文件中手动添加了对NLog的引用: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=
<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探查器)