Использование Nlog messageGeneratorFunc и структурированное ведение журнала - PullRequest
0 голосов
/ 08 января 2019

Использование Log.Info для записи структурированных журналов это круто:

Log.Info("The record {id} has firstname {firstname} and lastname {lastname}",
    record.Id, record.FirstName, record.LastName)

Я слишком часто использую методы Debug. Прежде чем использовать их для переноса в Log.IsDebugEnabled, но начал использовать варианты messageGeneratorFunc:

Log.Debug(() => string.Format("The record {0} has firstname {1} and lastname {2}",
    record.Id, record.FirstName, record.LastName);

Мне интересно, как использовать структурированное ведение журнала с сообщением GeneratorFunc?

Log.Debug(() => Log.Debug("The record {id} has firstname {firstname} and lastname {lastname}",
    record.Id, record.FirstName, record.LastName

выглядит странно ... Log.Debug Log.Debug но, конечно, работает ... внутренняя проверка IsDebugEnabled происходит дважды ... существует ли правильная альтернатива или это должно выглядеть?

1 Ответ

0 голосов
/ 09 января 2019

messageGeneratorFunc-делегат предназначен для специализированной сериализации тяжелых / больших объектов. NLog не будет вызывать делегата, когда LogLevel не включен.

Нет смысла использовать messageGeneratorFunc-делегат для обработки простых шаблонов сообщений. На самом деле это просто ухудшит производительность, потому что всегда нужно делать захват делегата, даже если LogLevel не включен.

Это намного дешевле и быстрее:

Log.Debug("The record {0} has firstname {1} and lastname {2}",
    record.Id, record.FirstName, record.LastName);

Log.Debug("The record {id} has firstname {firstname} and lastname {lastname}",
    record.Id, record.FirstName, record.LastName);

Чем это сделать (де-оптимизация):

Log.Debug(() => string.Format("The record {0} has firstname {1} and lastname {2}",
    record.Id, record.FirstName, record.LastName);

См. Также руководство по NLog: Регистратор должен обрабатывать форматирование строк

...