Я перерабатываю существующую систему ведения журнала, чтобы использовать 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 и получить доступ к различным частям (Тип, Сообщение, Временная метка). Как бы я это сделал? Я видел, как создать новый журнал с нуля, но я не хочу создавать новый массив памяти, я хочу получить доступ к существующему в моей конфигурации, вытащить данные журнала из него, а затем очистить память ( так что у меня нет утечки памяти).
Как получить доступ к 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
полученную цель к типу MemoryTarget
.
Я просто должен был сделать это сам:
Врожденная:
IList<string> logs = LogManager.Configuration.FindTargetByName<MemoryTarget>("MyTarget").Logs;
или используя бросок:
IList<string> logs = ((MemoryTarget)LogManager.Configuration.FindTargetByName("MyTarget")).Logs;