Skip to main content

rat_quickdns/
logger.rs

1//! DNS 查询器专用日志系统
2//!
3//! 基于 rat_logger 高性能日志库,提供适合 DNS 查询场景的彩色日志输出
4//!
5//! # 调用者初始化逻辑
6//!
7//! 这个模块遵循调用者初始化模式,用户必须先初始化rat_logger日志系统,
8//! 然后才能使用DNS日志功能。
9//!
10//! ## 推荐的初始化流程
11//!
12//! 调用者需要先初始化rat_logger系统,然后才能使用DNS日志功能。
13
14use rat_logger::{Level, LevelFilter};
15use std::io::Write;
16use std::sync::atomic::{AtomicBool, Ordering};
17use chrono::Local;
18
19/// 确保日志器只初始化一次
20static INIT: std::sync::Once = std::sync::Once::new();
21
22/// 日志初始化状态标志(线程安全)
23static INITIALIZED: AtomicBool = AtomicBool::new(false);
24
25/// DNS 查询专用日志格式化器
26pub fn dns_format(
27    buf: &mut dyn std::io::Write,
28    record: &rat_logger::config::Record
29) -> std::io::Result<()> {
30    let level = record.metadata.level;
31
32    // DNS 主题配色方案
33    let (level_color, level_bg, level_icon) = match level {
34        Level::Error => ("\x1b[97m", "\x1b[41m", "🚫"), // 白字红底 - DNS 错误
35        Level::Warn => ("\x1b[30m", "\x1b[43m", "⚠️ "), // 黑字黄底 - DNS 警告
36        Level::Info => ("\x1b[97m", "\x1b[42m", "🌐"), // 白字绿底 - DNS 查询
37        Level::Debug => ("\x1b[30m", "\x1b[46m", "🔍"), // 黑字青底 - DNS 调试
38        Level::Trace => ("\x1b[97m", "\x1b[45m", "📡"), // 白字紫底 - DNS 追踪
39    };
40
41    // 颜色定义
42    let timestamp_color = "\x1b[90m"; // 灰色时间戳
43    let message_color = "\x1b[37m";   // 亮白色消息
44    let reset = "\x1b[0m";
45
46    // 获取当前时间
47    let now = Local::now();
48    let timestamp = now.format("%H:%M:%S%.3f");
49
50    writeln!(
51        buf,
52        "{}{} {}{}{:5}{} {} {}{}{}",
53        timestamp_color, timestamp,        // 时间戳
54        level_color, level_bg, level, reset, // 彩色级别标签
55        level_icon,                        // DNS 相关图标
56        message_color, record.args, reset  // 消息内容
57    )
58}
59
60/// 初始化 DNS 查询器日志系统(线程安全,防止重复初始化)
61///
62/// **注意**: 这个函数现在使用调用者初始化模式。调用者必须先初始化rat_logger日志系统。
63///
64/// # Arguments
65/// * `level` - 日志级别过滤器,传入 `LevelFilter::Off` 可禁用日志
66///
67/// # Example
68/// 使用方法:
69/// 1. 首先初始化rat_logger系统(调用者责任)
70/// 2. 然后调用此函数初始化DNS日志格式
71pub fn init_dns_logger(level: LevelFilter) -> Result<(), Box<dyn std::error::Error>> {
72    // 检查rat_logger是否已经初始化
73    // 注意:这里我们只是设置一个标志,实际的日志系统初始化由调用者负责
74    INIT.call_once(|| {
75        INITIALIZED.store(true, Ordering::SeqCst);
76    });
77
78    // 设置rat_logger的全局日志级别
79    rat_logger::core::set_max_level(level);
80
81    Ok(())
82}
83
84/// 安全的日志初始化函数,默认禁用日志输出
85///
86/// 这个函数专门用于构造器,确保默认情况下不输出日志
87pub fn init_dns_logger_silent() -> Result<(), Box<dyn std::error::Error>> {
88    init_dns_logger(LevelFilter::Off)
89}
90
91/// 检查DNS日志系统是否已初始化
92pub fn is_dns_logger_initialized() -> bool {
93    INITIALIZED.load(Ordering::SeqCst)
94}
95
96/// DNS 查询相关的便捷日志宏
97#[macro_export]
98macro_rules! dns_query {
99    ($domain:expr, $record_type:expr) => {
100        $crate::info!("🔍 查询 {} 记录: {}", $record_type, $domain);
101    };
102}
103
104/// DNS响应日志宏
105///
106/// 记录成功的DNS响应信息,包括域名、记录数量和响应时间
107#[macro_export]
108macro_rules! dns_response {
109    ($domain:expr, $count:expr, $duration:expr) => {
110        $crate::info!("✅ {} 响应: {} 条记录 ({}ms)", $domain, $count, $duration);
111    };
112}
113
114/// DNS错误日志宏
115///
116/// 记录DNS查询过程中的错误信息
117#[macro_export]
118macro_rules! dns_error {
119    ($($arg:tt)*) => {
120        $crate::error!($($arg)*)
121    };
122}
123
124/// DNS调试日志宏
125///
126/// 记录DNS查询过程中的调试信息
127#[macro_export]
128macro_rules! dns_debug {
129    ($($arg:tt)*) => {
130        $crate::debug!($($arg)*)
131    };
132}
133
134/// DNS信息日志宏
135///
136/// 记录DNS查询过程中的一般信息
137#[macro_export]
138macro_rules! dns_info {
139    ($($arg:tt)*) => {
140        $crate::info!($($arg)*)
141    };
142}
143
144/// DNS警告日志宏
145///
146/// 记录DNS查询过程中的警告信息
147#[macro_export]
148macro_rules! dns_warn {
149    ($($arg:tt)*) => {
150        $crate::warn!($($arg)*)
151    };
152}
153
154/// DNS传输日志宏
155///
156/// 记录DNS传输协议相关信息,如UDP、TCP、DoH、DoT的连接状态和数据传输
157#[macro_export]
158macro_rules! dns_transport {
159    ($($arg:tt)*) => {
160        $crate::info!($($arg)*)
161    };
162}
163
164/// DNS超时日志宏
165///
166/// 记录DNS查询超时信息,包括域名和超时时间
167#[macro_export]
168macro_rules! dns_timeout {
169    ($domain:expr, $timeout:expr) => {
170        $crate::warn!("⏰ {} 查询超时: {}ms", $domain, $timeout);
171    };
172}
173
174/// DNS缓存命中日志宏
175///
176/// 记录DNS缓存命中信息,表示查询结果从本地缓存中获取
177#[macro_export]
178macro_rules! dns_cache_hit {
179    ($domain:expr) => {
180        $crate::debug!("💾 缓存命中: {}", $domain);
181    };
182}
183
184/// DNS缓存未命中日志宏
185///
186/// 记录DNS缓存未命中信息,表示需要向上游服务器发送查询请求
187#[macro_export]
188macro_rules! dns_cache_miss {
189    ($domain:expr) => {
190        $crate::debug!("🔄 缓存未命中: {}", $domain);
191    };
192}
193
194/// DNS上游服务器查询日志宏
195///
196/// 记录向上游服务器发送DNS查询的详细信息,用于追踪查询路由
197#[macro_export]
198macro_rules! dns_upstream {
199    ($server:expr, $domain:expr) => {
200        $crate::trace!("📡 上游服务器 {} 查询: {}", $server, $domain);
201    };
202}
203
204/// DNS查询策略日志宏
205///
206/// 记录使用的DNS查询策略信息,如负载均衡、故障转移、缓存优先等策略选择
207#[macro_export]
208macro_rules! dns_strategy {
209    ($strategy:expr, $domain:expr) => {
210        $crate::debug!("🎯 使用策略 {} 查询: {}", $strategy, $domain);
211    };
212}