Skip to main content

systemprompt_logging/
lib.rs

1pub mod extension;
2pub mod layer;
3pub mod models;
4pub mod repository;
5pub mod services;
6pub mod trace;
7
8pub use extension::LoggingExtension;
9
10pub use layer::DatabaseLayer;
11pub use models::{LogEntry, LogFilter, LogLevel};
12pub use repository::{AnalyticsEvent, AnalyticsRepository, LoggingRepository};
13pub use services::{
14    is_startup_mode, publish_log, set_log_publisher, set_startup_mode, CliService,
15    DatabaseLogService, FilterSystemFields, LoggingMaintenanceService, RequestSpan,
16    RequestSpanBuilder, SystemSpan,
17};
18pub use trace::{
19    AiRequestInfo, AiRequestSummary, AiTraceService, ConversationMessage, ExecutionStep,
20    ExecutionStepSummary, McpExecutionSummary, McpToolExecution, TaskArtifact, TaskInfo,
21    ToolLogEntry, TraceEvent, TraceQueryService,
22};
23
24use std::sync::OnceLock;
25
26use systemprompt_database::DbPool;
27use tracing_subscriber::layer::SubscriberExt;
28use tracing_subscriber::util::SubscriberInitExt;
29use tracing_subscriber::{EnvFilter, Layer};
30
31static LOGGING_INITIALIZED: OnceLock<()> = OnceLock::new();
32
33pub fn init_logging(db_pool: DbPool) {
34    if LOGGING_INITIALIZED.set(()).is_err() {
35        return;
36    }
37
38    let console_filter = if is_startup_mode() {
39        EnvFilter::new("warn")
40    } else {
41        EnvFilter::try_from_default_env().unwrap_or_else(|_| {
42            EnvFilter::new("info,tokio_cron_scheduler=warn,sqlx::postgres::notice=warn,handlebars=warn,sqlx::query=warn")
43        })
44    };
45
46    let fmt_layer = tracing_subscriber::fmt::layer()
47        .fmt_fields(FilterSystemFields::new())
48        .with_target(true)
49        .with_writer(std::io::stderr)
50        .with_filter(console_filter);
51
52    let db_layer =
53        DatabaseLayer::new(db_pool).with_filter(tracing_subscriber::filter::LevelFilter::INFO);
54
55    tracing_subscriber::registry()
56        .with(fmt_layer)
57        .with(db_layer)
58        .init();
59}
60
61pub fn init_console_logging() {
62    init_console_logging_with_level(None);
63}
64
65pub fn init_console_logging_with_level(level: Option<&str>) {
66    if LOGGING_INITIALIZED.set(()).is_err() {
67        return;
68    }
69
70    let env_filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| {
71        let base = level.unwrap_or("info");
72        EnvFilter::new(format!(
73            "{},tokio_cron_scheduler=warn,sqlx::postgres::notice=warn,handlebars=warn,sqlx::query=warn",
74            base
75        ))
76    });
77
78    tracing_subscriber::fmt().with_env_filter(env_filter).init();
79}