Skip to main content

better_fetch/plugins/
logger.rs

1use async_trait::async_trait;
2use tracing::{error, info, warn};
3
4use crate::hooks::{ErrorContext, Hooks};
5use crate::plugin::Plugin;
6
7/// Tracing-based logger plugin (request, response, retry, error).
8#[derive(Debug, Clone)]
9pub struct LoggerPlugin {
10    pub enabled: bool,
11    pub verbose: bool,
12}
13
14impl LoggerPlugin {
15    pub fn new() -> Self {
16        Self {
17            enabled: true,
18            verbose: false,
19        }
20    }
21
22    pub fn enabled(mut self, enabled: bool) -> Self {
23        self.enabled = enabled;
24        self
25    }
26
27    pub fn verbose(mut self, verbose: bool) -> Self {
28        self.verbose = verbose;
29        self
30    }
31}
32
33impl Default for LoggerPlugin {
34    fn default() -> Self {
35        Self::new()
36    }
37}
38
39#[async_trait]
40impl Plugin for LoggerPlugin {
41    fn id(&self) -> &'static str {
42        "logger"
43    }
44
45    fn hooks(&self) -> Hooks {
46        let enabled = self.enabled;
47        let verbose = self.verbose;
48
49        Hooks::new()
50            .on_request(move |ctx| {
51                let enabled = enabled;
52                let verbose = verbose;
53                async move {
54                    if enabled {
55                        if verbose {
56                            info!(
57                                method = %ctx.method,
58                                url = %ctx.url,
59                                "better-fetch request"
60                            );
61                        } else {
62                            info!(url = %ctx.url, "better-fetch request");
63                        }
64                    }
65                    Ok(ctx)
66                }
67            })
68            .on_response({
69                let enabled = self.enabled;
70                let verbose = self.verbose;
71                move |ctx| {
72                    let enabled = enabled;
73                    let verbose = verbose;
74                    async move {
75                        if enabled {
76                            let status = ctx.response.status();
77                            if verbose {
78                                info!(
79                                    status = %status,
80                                    url = %ctx.request.url,
81                                    "better-fetch response"
82                                );
83                            } else {
84                                info!(status = %status, "better-fetch response");
85                            }
86                        }
87                        Ok(ctx.response)
88                    }
89                }
90            })
91            .on_retry({
92                let enabled = self.enabled;
93                move |ctx| {
94                    let enabled = enabled;
95                    async move {
96                        if enabled {
97                            warn!(
98                                retry_attempt = ctx.request.retry_attempt,
99                                next_attempt = ctx.request.retry_attempt + 1,
100                                status = %ctx.response.status(),
101                                url = %ctx.request.url,
102                                "better-fetch retry"
103                            );
104                        }
105                    }
106                }
107            })
108            .on_error({
109                let enabled = self.enabled;
110                move |ctx: ErrorContext| {
111                    let enabled = enabled;
112                    async move {
113                        if enabled {
114                            error!(
115                                error = %ctx.error,
116                                url = %ctx.request.url,
117                                "better-fetch error"
118                            );
119                        }
120                    }
121                }
122            })
123    }
124}