opentelemetry_sdk/logs/
logger.rs1use 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)]
9pub 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 fn emit(&self, mut record: Self::LogRecord) {
37 let provider = &self.provider;
38 let processors = provider.log_processors();
39
40 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}