|  | 
| 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