Как получить доступ к существующей NLog MemoryTarget

1

Я перерабатываю существующую систему ведения журнала, чтобы использовать 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 в С#?

Теги:
nlog

3 ответа

2
Лучший ответ

К сожалению, вы не можете получить доступ к различным частям журнала. Журналы хранятся в виде строк, при этом все рендеринги макетов уже заменяются их значениями. Все, что вы можете сделать, это вручную разобрать каждую строку журнала. Например

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];
    //...
}
  • 0
    Это работало правильно, но теперь у меня есть новая проблема. Как удалить сообщения из «MemLogger»? Если я использую target.Clear (), он очищает только целевой экземпляр, а не сам MemLogger, поэтому у меня возникает утечка памяти, когда я слишком долго оставляю свое приложение открытым. Как очистить журналы MemLogger, чтобы предотвратить утечку памяти?
  • 0
    Регистратор @Fuzzerker содержит ссылки на целевые экземпляры, в которые он настроен для записи. Регистратор не содержит никаких сообщений. Он просто записывает события журнала во все цели. Если вы удаляете сообщения из памяти, эти сообщения исчезают и не хранятся в другом месте. Используйте какой-нибудь профилировщик, чтобы найти утечку памяти (мне нравится Ants profiler)
1

Что-то вроде этого:

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

При желании вы можете MemoryTarget полученную цель к типу MemoryTarget.

0

Я просто должен был сделать это сам:

Врожденная:

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

или используя бросок:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню