Skip to main content

opentelemetry_sdk/logs/
logger.rs

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