mod config;
mod default_mapper;
mod gauth;
pub mod google_logger;
pub mod google_writer;
mod log_entry;
mod runtime;
mod utils;
use derive_builder::Builder;
use google_logger::{GoogleLogger, LogMapper, LoggerError};
use tracing_subscriber::Registry;
use self::google_writer::GoogleWriterHandle;
pub use config::GoogleWriterConfig;
pub use default_mapper::DefaultLogMapper;
pub use runtime::GoogleWriterRuntime;
pub use utils::{extract_trace_id, get_severity};
pub type DefaultGCloudLayerConfig = GCloudLayerConfig<DefaultLogMapper>;
pub type DefaultGCloudLayerConfigBuilder = GCloudLayerConfigBuilder<DefaultLogMapper>;
#[derive(Builder, Clone)]
#[builder(pattern = "owned", setter(into, strip_option))]
pub struct GCloudLayerConfig<M: LogMapper = DefaultLogMapper> {
log_name: String,
logger_credential: Vec<u8>,
#[builder(default)]
config: GoogleWriterConfig,
#[builder(default)]
log_mapper: M,
}
impl<M: LogMapper> GCloudLayerConfig<M> {
pub fn build_layer(
self,
) -> Result<
(
tracing_stackdriver::Layer<Registry, impl Fn() -> GoogleWriterHandle>,
GoogleWriterRuntime<M>,
),
LoggerError,
> {
let GCloudLayerConfig {
config,
log_mapper,
log_name,
logger_credential,
} = self;
let log_name = std::sync::Arc::from(log_name);
let logger = GoogleLogger::new(log_name, logger_credential, log_mapper)?;
let runtime = GoogleWriterRuntime::new(logger.clone(), config.clone());
let layer = tracing_stackdriver::layer().with_writer({
let writer = runtime.writer();
move || writer.clone()
});
Ok((layer, runtime))
}
}