game_manager_lib\utils/
logger.rs

1//! Módulo responsável pela configuração do sistema de logging da aplicação.
2//!
3//! Utiliza a crate `tracing` para capturar e formatar logs, com suporte a rotação de arquivos diários.
4//! Níveis de log configuráveis via variáveis de ambiente.
5
6use std::path::PathBuf;
7use tracing_appender::non_blocking::WorkerGuard;
8use tracing_subscriber::{filter::EnvFilter, fmt, layer::SubscriberExt, util::SubscriberInitExt};
9
10#[cfg(debug_assertions)]
11use tracing_subscriber::Layer;
12
13pub fn init_logging(log_dir: PathBuf) -> WorkerGuard {
14    // Configura rotação de logs: cria um arquivo novo por dia - Ex: playlite.log.2026-01-02
15    let file_appender = tracing_appender::rolling::daily(log_dir, "playlite.log");
16
17    // O WorkerGuard garante que os logs sejam escritos antes do app fechar
18    let (non_blocking, guard) = tracing_appender::non_blocking(file_appender);
19
20    // Configura o formato do log para arquivo
21    // Apenas INFO+ para reduzir ruído (DEBUG fica disponível via variável de ambiente)
22    let registry = tracing_subscriber::registry()
23        .with(EnvFilter::new("warn,game_manager_lib=info,tao=error"))
24        .with(
25            fmt::Layer::default()
26                .with_writer(non_blocking)
27                .with_ansi(false) // Remove cores para o arquivo ficar legível
28                .with_target(false)
29                .with_file(true)
30                .with_line_number(true),
31        );
32
33    // Em modo dev: stdout apenas para WARN+ (erros importantes)
34    #[cfg(debug_assertions)]
35    let registry = registry.with(
36        fmt::Layer::default()
37            .with_writer(std::io::stdout)
38            .with_filter(tracing_subscriber::filter::LevelFilter::WARN),
39    );
40
41    registry.init();
42
43    guard
44}