Если я использую Opentracing, нужно ли мне снова использовать NLog?

Я регистрирую информацию о трассировке приложений, используя Jaeger.

Нужно ли снова использовать другой пакет журнала?

2 ответа

Решение

OpenTracing - это фреймворк для распределенной трассировки. Таким образом, речь идет скорее о мониторинге производительности и наблюдаемости, чем о регистрации (о чем NLog).

OpenTracing позволяет вам вручную обрабатывать ваш код для генерации трасс с соответствующими интервалами, содержащими информацию о выполнении кода в вашем приложении. Это включает в себя аннотации промежутков с ошибками и произвольными ключами и значениями, которые вы могли бы использовать вместо регистрации. Однако это не то же самое, что выделенное структурированное ведение журнала.

Можно перенаправить события LogEvents из NLog в OpenTracing, используя эту цель:

          [Target("OpenTracing")]
    public class OpenTracingTarget : TargetWithContext
    {
        private readonly OpenTracing.ITracer _tracer;

        public bool SetTagErrorOnException { get; set; }

        public OpenTracingTarget()
            :this(null)
        {
        }

        public OpenTracingTarget(OpenTracing.ITracer tracer)
        {
            _tracer = tracer ?? OpenTracing.Util.GlobalTracer.Instance;
            ContextProperties.Add(new TargetPropertyWithContext("component", "${logger}"));
            ContextProperties.Add(new TargetPropertyWithContext("level", "${level}"));
            ContextProperties.Add(new TargetPropertyWithContext("message", "${message}"));
            ContextProperties.Add(new TargetPropertyWithContext("event", "${event-properties:EventId_Name}") { IncludeEmptyValue = false });
            ContextProperties.Add(new TargetPropertyWithContext("eventid", "${event-properties:EventId_Id}") { IncludeEmptyValue = false });
        }

        protected override void Write(LogEventInfo logEvent)
        {
            var span = _tracer.ActiveSpan;
            if (span == null)
                return;

            if (SetTagErrorOnException && logEvent.Exception != null)
            {
                span.SetTag(OpenTracing.Tag.Tags.Error, true);
            }

            var fields = GetAllProperties(logEvent);
            if (logEvent.Exception != null)
            {
                fields[OpenTracing.LogFields.ErrorKind] = logEvent.Exception.GetType().ToString();
                fields[OpenTracing.LogFields.ErrorObject] = logEvent.Exception;
            }

            span.Log(fields);
        }
    }
Другие вопросы по тегам