Есть два фундаментальных преимущества структурированного подхода, которые нельзя эмулировать с помощью текстовых журналов без (иногда экстремальных уровней) дополнительных усилий.
Типы событий
Когда вы пишете два события с log4net, как:
log.Debug("Disk quota {0} exceeded by user {1}", 100, "DTI-Matt");
log.Debug("Disk quota {0} exceeded by user {1}", 150, "nblumhardt");
Это даст похожий текст:
Disk quota 100 exceeded by user DTI-Matt
Disk quota 150 exceeded by user nblumhardt
Но что касается машинной обработки, это всего лишь две строки разного текста.
Возможно, вы захотите найти все события «превышение дисковой квоты», но упрощенный случай поиска событий like 'Disk quota%'
упадет, как только произойдет другое событие, похожее на:
Disk quota 100 set for user DTI-Matt
Регистрация текста отбрасывает изначально имеющуюся у нас информацию об источнике события, и это необходимо реконструировать при чтении журналов, как правило, с использованием все более сложных выражений совпадений.
Напротив, когда вы пишете следующие два события Serilog :
log.Debug("Disk quota {Quota} exceeded by user {Username}", 100, "DTI-Matt");
log.Debug("Disk quota {Quota} exceeded by user {Username}", 150, "nblumhardt");
Они производят текстовый вывод, аналогичный версии log4net, но за кулисами "Disk quota {Quota} exceeded by user {Username}"
шаблон сообщения переносится обоими событиями.
С помощью соответствующего приемника вы сможете позже писать запросы where MessageTemplate = 'Disk quota {Quota} exceeded by user {Username}'
и получать именно те события, когда дисковая квота была превышена.
Не всегда удобно хранить весь шаблон сообщения с каждым событием журнала, поэтому некоторые приемники хэшируют шаблон сообщения в числовом EventType
значении (например 0x1234abcd
), или вы можете добавить обогащение в конвейер ведения журнала, чтобы сделать это самостоятельно .
Это более тонкое, чем следующее различие ниже, но чрезвычайно мощное при работе с большими томами журналов.
Структурированные данные
Опять же, учитывая два события об использовании дискового пространства, может быть достаточно легко использовать текстовые журналы для запроса конкретного пользователя like 'Disk quota' and like 'DTI-Matt'
.
Но производственная диагностика не всегда так проста. Представьте, что необходимо найти события, в которых превышена квота диска ниже 125 МБ?
С Serilog это возможно в большинстве стоков, используя вариант:
Quota < 125
Создание такого рода запрос из регулярного выражения является возможным, но это становится утомительными быстро и , как правило , заканчивается время крайней меры.
Теперь добавьте к этому тип события:
Quota < 125 and EventType = 0x1234abcd
Здесь вы начинаете видеть, как эти возможности сочетаются простым способом, чтобы отладка в процессе производства с журналами выглядела как первоклассная деятельность по разработке.
Еще одно преимущество, возможно, не такое простое, чтобы его можно было предотвратить заранее, но после того, как отладка производства вышла из сферы хакерства регулярных выражений, разработчики начинают гораздо больше ценить журналы и проявляют больше внимания и внимания при их написании. Лучшие журналы -> лучшее качество приложений -> больше счастья вокруг.