|
1 | | -use opentelemetry_appender_tracing::layer; |
2 | | -use opentelemetry_sdk::logs::SdkLoggerProvider; |
3 | | -use opentelemetry_sdk::Resource; |
4 | | -use tracing::error; |
5 | | -use tracing_subscriber::{prelude::*, EnvFilter}; |
| 1 | +use log::{error, info, warn, Level}; |
| 2 | +use opentelemetry_appender_log::OpenTelemetryLogBridge; |
| 3 | +use opentelemetry_sdk::logs::{BatchLogProcessor, SdkLoggerProvider}; |
| 4 | +use opentelemetry_stdout::LogExporter; |
6 | 5 |
|
7 | | -fn main() { |
8 | | - let exporter = opentelemetry_stdout::LogExporter::default(); |
9 | | - let provider: SdkLoggerProvider = SdkLoggerProvider::builder() |
10 | | - .with_resource( |
11 | | - Resource::builder() |
12 | | - .with_service_name("log-appender-tracing-example") |
13 | | - .build(), |
14 | | - ) |
15 | | - .with_simple_exporter(exporter) |
| 6 | +#[tokio::main] |
| 7 | +async fn main() { |
| 8 | + //Create an exporter that writes to stdout |
| 9 | + let exporter = LogExporter::default(); |
| 10 | + //Create a LoggerProvider and register the exporter |
| 11 | + let logger_provider = SdkLoggerProvider::builder() |
| 12 | + .with_log_processor(BatchLogProcessor::builder(exporter).build()) |
16 | 13 | .build(); |
17 | 14 |
|
18 | | - // To prevent a telemetry-induced-telemetry loop, OpenTelemetry's own internal |
19 | | - // logging is properly suppressed. However, logs emitted by external components |
20 | | - // (such as reqwest, tonic, etc.) are not suppressed as they do not propagate |
21 | | - // OpenTelemetry context. Until this issue is addressed |
22 | | - // (https://github.com/open-telemetry/opentelemetry-rust/issues/2877), |
23 | | - // filtering like this is the best way to suppress such logs. |
24 | | - // |
25 | | - // The filter levels are set as follows: |
26 | | - // - Allow `info` level and above by default. |
27 | | - // - Completely restrict logs from `hyper`, `tonic`, `h2`, and `reqwest`. |
28 | | - // |
29 | | - // Note: This filtering will also drop logs from these components even when |
30 | | - // they are used outside of the OTLP Exporter. |
31 | | - let filter_otel = EnvFilter::new("info") |
32 | | - .add_directive("hyper=off".parse().unwrap()) |
33 | | - .add_directive("tonic=off".parse().unwrap()) |
34 | | - .add_directive("h2=off".parse().unwrap()) |
35 | | - .add_directive("reqwest=off".parse().unwrap()); |
36 | | - let otel_layer = layer::OpenTelemetryTracingBridge::new(&provider).with_filter(filter_otel); |
| 15 | + // Setup Log Appender for the log crate. |
| 16 | + let otel_log_appender = OpenTelemetryLogBridge::new(&logger_provider); |
| 17 | + log::set_boxed_logger(Box::new(otel_log_appender)).unwrap(); |
| 18 | + log::set_max_level(Level::Info.to_level_filter()); |
37 | 19 |
|
38 | | - // Create a new tracing::Fmt layer to print the logs to stdout. It has a |
39 | | - // default filter of `info` level and above, and `debug` and above for logs |
40 | | - // from OpenTelemetry crates. The filter levels can be customized as needed. |
41 | | - let filter_fmt = EnvFilter::new("info").add_directive("opentelemetry=debug".parse().unwrap()); |
42 | | - let fmt_layer = tracing_subscriber::fmt::layer() |
43 | | - .with_thread_names(true) |
44 | | - .with_filter(filter_fmt); |
| 20 | + // Emit logs using macros from the log crate. |
| 21 | + let fruit = "apple"; |
| 22 | + let price = 2.99; |
45 | 23 |
|
46 | | - tracing_subscriber::registry() |
47 | | - .with(otel_layer) |
48 | | - .with(fmt_layer) |
49 | | - .init(); |
| 24 | + error!(fruit, price; "hello from {fruit}. My price is {price}"); |
| 25 | + warn!("warn!"); |
| 26 | + info!("test log!"); |
50 | 27 |
|
51 | | - error!(name : "my-event-name", target : "my-system", event_id = 20, user_name = "otel", user_email = "[email protected]", message = "This is an example message"); |
52 | | - let _ = provider.shutdown(); |
| 28 | + let _ = logger_provider.shutdown(); |
53 | 29 | } |
0 commit comments