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    #[cfg(test)]
23    pub(crate) fn instrumentation_scope(&self) -> &InstrumentationScope {
24        &self.scope
25    }
26}
27
28impl opentelemetry::logs::Logger for SdkLogger {
29    type LogRecord = SdkLogRecord;
30
31    fn create_log_record(&self) -> Self::LogRecord {
32        SdkLogRecord::new()
33    }
34
35    /// Emit a `LogRecord`.
36    fn emit(&self, mut record: Self::LogRecord) {
37        let provider = &self.provider;
38        let processors = provider.log_processors();
39
40        //let mut log_record = record;
41        if record.trace_context.is_none() {
42            let trace_context = Context::map_current(|cx| {
43                cx.has_active_span()
44                    .then(|| TraceContext::from(cx.span().span_context()))
45            });
46
47            if let Some(ref trace_context) = trace_context {
48                record.trace_context = Some(trace_context.clone());
49            }
50        }
51        if record.observed_timestamp.is_none() {
52            record.observed_timestamp = Some(now());
53        }
54
55        for p in processors {
56            p.emit(&mut record, &self.scope);
57        }
58    }
59
60    #[cfg(feature = "spec_unstable_logs_enabled")]
61    fn event_enabled(&self, level: Severity, target: &str) -> bool {
62        self.provider
63            .log_processors()
64            .iter()
65            .any(|processor| processor.event_enabled(level, target, self.scope.name().as_ref()))
66    }
67}