opentelemetry_sdk/logs/
logger.rs

1use super::{SdkLogRecord, SdkLoggerProvider, TraceContext};
2use opentelemetry::{trace::TraceContextExt, Context, InstrumentationScope};
3
4#[cfg(feature = "spec_unstable_logs_enabled")]
5use opentelemetry::logs::Severity;
6use opentelemetry::time::now;
7
8#[derive(Debug)]
9/// The object for emitting [`LogRecord`]s.
10///
11/// [`LogRecord`]: opentelemetry::logs::LogRecord
12pub struct SdkLogger {
13    scope: InstrumentationScope,
14    provider: SdkLoggerProvider,
15}
16
17impl SdkLogger {
18    pub(crate) fn new(scope: InstrumentationScope, provider: SdkLoggerProvider) -> Self {
19        SdkLogger { scope, provider }
20    }
21}
22
23impl opentelemetry::logs::Logger for SdkLogger {
24    type LogRecord = SdkLogRecord;
25
26    fn create_log_record(&self) -> Self::LogRecord {
27        SdkLogRecord::new()
28    }
29
30    /// Emit a `LogRecord`.
31    fn emit(&self, mut record: Self::LogRecord) {
32        if Context::is_current_telemetry_suppressed() {
33            return;
34        }
35        let provider = &self.provider;
36        let processors = provider.log_processors();
37
38        //let mut log_record = record;
39        if record.trace_context.is_none() {
40            Context::map_current(|cx| {
41                cx.has_active_span().then(|| {
42                    record.trace_context = Some(TraceContext::from(cx.span().span_context()))
43                })
44            });
45        }
46        if record.observed_timestamp.is_none() {
47            record.observed_timestamp = Some(now());
48        }
49
50        for p in processors {
51            p.emit(&mut record, &self.scope);
52        }
53    }
54
55    #[cfg(feature = "spec_unstable_logs_enabled")]
56    #[inline]
57    fn event_enabled(&self, level: Severity, target: &str, name: Option<&str>) -> bool {
58        if Context::is_current_telemetry_suppressed() {
59            return false;
60        }
61        self.provider
62            .log_processors()
63            .iter()
64            .any(|processor| processor.event_enabled(level, target, name))
65    }
66}