如果我使用Opentracing,是否需要再次使用NLog?

时间:2019-01-08 02:20:10

标签: logging opentracing jaeger

我使用Jaeger记录应用程序跟踪信息。

我是否需要再次使用其他日志包?

2 个答案:

答案 0 :(得分:1)

OpenTracing是用于分布式跟踪的框架。因此,与日志记录(NLog所要解决的)相比,它更关注性能监视和可观察性。

OpenTracing允许您手动检测代码以生成包含相关范围的跟踪,这些范围包含有关应用程序中代码执行的信息。这包括使用错误和任意键和值注释跨度,您可以 使用它们代替日志。但是,这与专用结构化日志记录不同。

答案 1 :(得分:0)

可以使用此目标将 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);
        }
    }