Я использую этот метод https://github.com/NLog/NLog/tree/master/examples/ExndingLoggers/LoggerWrapper для расширения NLog, чтобы я мог добавлять настраиваемые свойства к своим событиям. Итак, мой код выглядит так:
public void WriteMessage(string eventID, string message)
{
LogEventInfo logEvent = new LogEventInfo(LogLevel.Info, _logger.Name, message);
logEvent.Properties["EventID"] = eventID;
_logger.Log(typeof(MyLogger), logEvent);
}
В методе WriteMessage я попытался получить имена класса и метода вызывающего абонента следующим образом:
logEvent.CallerClassName;
logEvent.CallerMemberName;
но оба возвращают null.
Как я могу получить значения?





Так же, как вы можете назначить LogEventInfo.Exception, вы также можете назначить LogEventInfo.CallerClassName (или LogEventInfo.CallerMemberName).
Вызов метода получения для LogEventInfo.Exception вернет объект-исключение, только если он назначен. То же самое и с LogEventInfo.CallerClassName (или LogEventInfo.CallerMemberName).
NLog Logger отвечает за захват позывных. Logger выполняет захват при получении LogEventInfo. Захват очень дорогостоящий и происходит только в том случае, если цель настроена на использование callite.
Вместо того, чтобы пытаться пройти StackTrace самостоятельно. Тогда вы можете использовать информацию о вызывающем абоненте: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/caller-information
NLog работает над улучшением производительности call-сайта, используя информацию о вызывающем абоненте. См. https://github.com/NLog/NLog/pull/2527
Я говорю, что если вам нужен callite где-то в вашей цели NLog, и вы не хотите захватывать его самостоятельно. Тогда просто используйте ${callsite}. См. Также github.com/NLog/NLog/wiki/Callsite-layout-renderer
Хорошо, поэтому в моем примере кода выше, когда я ссылаюсь на ${callsite} в моем макете, уже слишком поздно, так как сайт говорит, что я нахожусь в WriteMessage. Так что в этом случае у меня нет другого выбора, кроме как самому получить информацию о вызывающем абоненте (однако я могу ее получить) - вне nlog - и передать ее в WriteMessage, правильно?
@Howiecamp При вызове _logger.Log(typeof(MyLogger), logEvent); убедитесь, что typeof указывает тип класса, который содержит метод WriteMessage. NLog будет игнорировать все методы из класса (или интерфейса), указанного в typeof (обязательно используйте NLog 4.5 или новее). См. Также github.com/NLog/NLog/wiki/…
Когда мои сообщения появляются в моих файлах журнала, они определенно содержат правильную информацию о цели - никаких проблем. Что я пытаюсь сделать, так это получить эту информацию о вызываемом сайте отдельно, внутри метода WriteMessage, чтобы я мог использовать ее другими способами. Например. Я создаю документы elasticsearch из информации журнала, и я хочу иметь поле специально для информации о вызывающем абоненте. Сегодня, как и в файлах журнала, вызывающий абонент (callite) отображается как часть всей записи журнала, но я хочу получить информацию о вызывающем абоненте отдельно, программно. Пожалуйста, дайте мне знать, если в этом есть смысл.
Допустим, вы используете NLog.Targets.ElasticSearch, тогда вы можете увидеть в вики, чтобы добавить свои собственные настраиваемые поля: github.com/reactive-markets/NLog.Targets.ElasticSearch/wiki (там вы можете указать field name = "callsite" layout = "${callsite}")
Рольф, ты говоришь, что мне нужно вручную получить информацию о вызывающем абоненте и передать ее в метод WriteMessage, и что я не могу получить ее из NLog? Кроме того, не слишком ли поздно получать его, когда я уже нахожусь в сообщении записи, поскольку тогда у меня будет WriteMessage в качестве вызывающего абонента, а не исходное местоположение?