1use rat_logger::{Level, LevelFilter};
15use std::io::Write;
16use std::sync::atomic::{AtomicBool, Ordering};
17use chrono::Local;
18
19static INIT: std::sync::Once = std::sync::Once::new();
21
22static INITIALIZED: AtomicBool = AtomicBool::new(false);
24
25pub 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 let (level_color, level_bg, level_icon) = match level {
34 Level::Error => ("\x1b[97m", "\x1b[41m", "🚫"), Level::Warn => ("\x1b[30m", "\x1b[43m", "⚠️ "), Level::Info => ("\x1b[97m", "\x1b[42m", "🌐"), Level::Debug => ("\x1b[30m", "\x1b[46m", "🔍"), Level::Trace => ("\x1b[97m", "\x1b[45m", "📡"), };
40
41 let timestamp_color = "\x1b[90m"; let message_color = "\x1b[37m"; let reset = "\x1b[0m";
45
46 let now = Local::now();
48 let timestamp = now.format("%H:%M:%S%.3f");
49
50 writeln!(
51 buf,
52 "{}{} {}{}{:5}{} {} {}{}{}",
53 timestamp_color, timestamp, level_color, level_bg, level, reset, level_icon, message_color, record.args, reset )
58}
59
60pub fn init_dns_logger(level: LevelFilter) -> Result<(), Box<dyn std::error::Error>> {
72 INIT.call_once(|| {
75 INITIALIZED.store(true, Ordering::SeqCst);
76 });
77
78 rat_logger::core::set_max_level(level);
80
81 Ok(())
82}
83
84pub fn init_dns_logger_silent() -> Result<(), Box<dyn std::error::Error>> {
88 init_dns_logger(LevelFilter::Off)
89}
90
91pub fn is_dns_logger_initialized() -> bool {
93 INITIALIZED.load(Ordering::SeqCst)
94}
95
96#[macro_export]
98macro_rules! dns_query {
99 ($domain:expr, $record_type:expr) => {
100 $crate::info!("🔍 查询 {} 记录: {}", $record_type, $domain);
101 };
102}
103
104#[macro_export]
108macro_rules! dns_response {
109 ($domain:expr, $count:expr, $duration:expr) => {
110 $crate::info!("✅ {} 响应: {} 条记录 ({}ms)", $domain, $count, $duration);
111 };
112}
113
114#[macro_export]
118macro_rules! dns_error {
119 ($($arg:tt)*) => {
120 $crate::error!($($arg)*)
121 };
122}
123
124#[macro_export]
128macro_rules! dns_debug {
129 ($($arg:tt)*) => {
130 $crate::debug!($($arg)*)
131 };
132}
133
134#[macro_export]
138macro_rules! dns_info {
139 ($($arg:tt)*) => {
140 $crate::info!($($arg)*)
141 };
142}
143
144#[macro_export]
148macro_rules! dns_warn {
149 ($($arg:tt)*) => {
150 $crate::warn!($($arg)*)
151 };
152}
153
154#[macro_export]
158macro_rules! dns_transport {
159 ($($arg:tt)*) => {
160 $crate::info!($($arg)*)
161 };
162}
163
164#[macro_export]
168macro_rules! dns_timeout {
169 ($domain:expr, $timeout:expr) => {
170 $crate::warn!("⏰ {} 查询超时: {}ms", $domain, $timeout);
171 };
172}
173
174#[macro_export]
178macro_rules! dns_cache_hit {
179 ($domain:expr) => {
180 $crate::debug!("💾 缓存命中: {}", $domain);
181 };
182}
183
184#[macro_export]
188macro_rules! dns_cache_miss {
189 ($domain:expr) => {
190 $crate::debug!("🔄 缓存未命中: {}", $domain);
191 };
192}
193
194#[macro_export]
198macro_rules! dns_upstream {
199 ($server:expr, $domain:expr) => {
200 $crate::trace!("📡 上游服务器 {} 查询: {}", $server, $domain);
201 };
202}
203
204#[macro_export]
208macro_rules! dns_strategy {
209 ($strategy:expr, $domain:expr) => {
210 $crate::debug!("🎯 使用策略 {} 查询: {}", $strategy, $domain);
211 };
212}