pub struct Logger { /* private fields */ }Expand description
A file logger that writes messages to path and filters by level.
By default, the logger starts at LogLevel::Info.
Implementations§
Source§impl Logger
impl Logger
Sourcepub fn new<P: Into<PathBuf>>(path: P) -> Self
pub fn new<P: Into<PathBuf>>(path: P) -> Self
Creates a new Logger that writes to path.
The default level is LogLevel::Info.
§Examples
use log_easy::Logger;
let logger = Logger::new("app.log");Examples found in repository?
examples/global.rs (line 13)
11fn main() -> Result<()> {
12 // Initialize the global logger with a file path and log level.
13 log_easy::init_with(Logger::new("target/global.log").with_level(LogLevel::Trace))?;
14
15 // Non-fallible macros (errors are printed to stderr).
16 trace!("This is a trace message");
17 debug!("Debugging information here");
18 info!("Application started");
19 warn!("This is a warning");
20 error!("An error occurred");
21
22 // Fallible macros (return Result so you can handle failures).
23 try_trace!("This is a trace message using the try macro")?;
24 try_debug!("This is a debug message using the try macro")?;
25 try_info!("This is an info message using the try macro")?;
26 try_warn!("This is a warning message using the try macro")?;
27 try_error!("This is an error message using the try macro")?;
28
29 // Macros accept formatting args.
30 let user = "joe";
31 let attempts = 3;
32 let elapsed_ms = 127;
33 info!("User {user} has attempted login {attempts} times ({elapsed_ms}ms elapsed)");
34
35 Ok(())
36}More examples
examples/instance.rs (line 10)
8fn main() -> Result<()> {
9 // Create an independent Logger instance (separate file/level) without using the global macros.
10 let logger = Logger::new("target/instance.log").with_level(LogLevel::Info);
11
12 // Non-fallible instance logging (write failures go to stderr).
13 logger.trace("This trace message will not be logged due to log level");
14 logger.debug("This debug message will not be logged due to log level");
15 logger.info("Instance logger ready");
16 logger.warn("This is a warning with the instance logger");
17 logger.error("An error occurred with the instance logger");
18
19 // Fallible instance logging: returns Result so you can handle failures.
20 logger.try_trace("This is a trace message with try")?;
21 logger.try_debug("This is a debug message with try")?;
22 logger.try_info("This is an info message with try")?;
23 logger.try_warn("This is a warning with try")?;
24 logger.try_error("An error occurred with try")?;
25
26 // Instance loggers don't have macros, so format messages manually (macros target the global logger).
27 logger.try_info(&format!(
28 "Logger initialized with path: {:?} and level: {:?}",
29 logger.path(),
30 logger.level()
31 ))?;
32
33 Ok(())
34}Sourcepub fn with_level(self, level: LogLevel) -> Self
pub fn with_level(self, level: LogLevel) -> Self
Returns a new Logger configured with the given minimum log level.
Messages below this level are ignored.
§Examples
use log_easy::{Logger, LogLevel};
let logger = Logger::new("app.log").with_level(LogLevel::Debug);Examples found in repository?
examples/global.rs (line 13)
11fn main() -> Result<()> {
12 // Initialize the global logger with a file path and log level.
13 log_easy::init_with(Logger::new("target/global.log").with_level(LogLevel::Trace))?;
14
15 // Non-fallible macros (errors are printed to stderr).
16 trace!("This is a trace message");
17 debug!("Debugging information here");
18 info!("Application started");
19 warn!("This is a warning");
20 error!("An error occurred");
21
22 // Fallible macros (return Result so you can handle failures).
23 try_trace!("This is a trace message using the try macro")?;
24 try_debug!("This is a debug message using the try macro")?;
25 try_info!("This is an info message using the try macro")?;
26 try_warn!("This is a warning message using the try macro")?;
27 try_error!("This is an error message using the try macro")?;
28
29 // Macros accept formatting args.
30 let user = "joe";
31 let attempts = 3;
32 let elapsed_ms = 127;
33 info!("User {user} has attempted login {attempts} times ({elapsed_ms}ms elapsed)");
34
35 Ok(())
36}More examples
examples/instance.rs (line 10)
8fn main() -> Result<()> {
9 // Create an independent Logger instance (separate file/level) without using the global macros.
10 let logger = Logger::new("target/instance.log").with_level(LogLevel::Info);
11
12 // Non-fallible instance logging (write failures go to stderr).
13 logger.trace("This trace message will not be logged due to log level");
14 logger.debug("This debug message will not be logged due to log level");
15 logger.info("Instance logger ready");
16 logger.warn("This is a warning with the instance logger");
17 logger.error("An error occurred with the instance logger");
18
19 // Fallible instance logging: returns Result so you can handle failures.
20 logger.try_trace("This is a trace message with try")?;
21 logger.try_debug("This is a debug message with try")?;
22 logger.try_info("This is an info message with try")?;
23 logger.try_warn("This is a warning with try")?;
24 logger.try_error("An error occurred with try")?;
25
26 // Instance loggers don't have macros, so format messages manually (macros target the global logger).
27 logger.try_info(&format!(
28 "Logger initialized with path: {:?} and level: {:?}",
29 logger.path(),
30 logger.level()
31 ))?;
32
33 Ok(())
34}Sourcepub fn path(&self) -> &Path
pub fn path(&self) -> &Path
Gets the log file path.
Examples found in repository?
examples/instance.rs (line 29)
8fn main() -> Result<()> {
9 // Create an independent Logger instance (separate file/level) without using the global macros.
10 let logger = Logger::new("target/instance.log").with_level(LogLevel::Info);
11
12 // Non-fallible instance logging (write failures go to stderr).
13 logger.trace("This trace message will not be logged due to log level");
14 logger.debug("This debug message will not be logged due to log level");
15 logger.info("Instance logger ready");
16 logger.warn("This is a warning with the instance logger");
17 logger.error("An error occurred with the instance logger");
18
19 // Fallible instance logging: returns Result so you can handle failures.
20 logger.try_trace("This is a trace message with try")?;
21 logger.try_debug("This is a debug message with try")?;
22 logger.try_info("This is an info message with try")?;
23 logger.try_warn("This is a warning with try")?;
24 logger.try_error("An error occurred with try")?;
25
26 // Instance loggers don't have macros, so format messages manually (macros target the global logger).
27 logger.try_info(&format!(
28 "Logger initialized with path: {:?} and level: {:?}",
29 logger.path(),
30 logger.level()
31 ))?;
32
33 Ok(())
34}Sourcepub fn level(&self) -> LogLevel
pub fn level(&self) -> LogLevel
Gets the current log level.
Examples found in repository?
examples/instance.rs (line 30)
8fn main() -> Result<()> {
9 // Create an independent Logger instance (separate file/level) without using the global macros.
10 let logger = Logger::new("target/instance.log").with_level(LogLevel::Info);
11
12 // Non-fallible instance logging (write failures go to stderr).
13 logger.trace("This trace message will not be logged due to log level");
14 logger.debug("This debug message will not be logged due to log level");
15 logger.info("Instance logger ready");
16 logger.warn("This is a warning with the instance logger");
17 logger.error("An error occurred with the instance logger");
18
19 // Fallible instance logging: returns Result so you can handle failures.
20 logger.try_trace("This is a trace message with try")?;
21 logger.try_debug("This is a debug message with try")?;
22 logger.try_info("This is an info message with try")?;
23 logger.try_warn("This is a warning with try")?;
24 logger.try_error("An error occurred with try")?;
25
26 // Instance loggers don't have macros, so format messages manually (macros target the global logger).
27 logger.try_info(&format!(
28 "Logger initialized with path: {:?} and level: {:?}",
29 logger.path(),
30 logger.level()
31 ))?;
32
33 Ok(())
34}Sourcepub fn trace(&self, msg: &str)
pub fn trace(&self, msg: &str)
These methods log messages at their respective levels. If an error occurs (e.g., file write failure), it is printed to stderr but not returned.
Examples found in repository?
examples/instance.rs (line 13)
8fn main() -> Result<()> {
9 // Create an independent Logger instance (separate file/level) without using the global macros.
10 let logger = Logger::new("target/instance.log").with_level(LogLevel::Info);
11
12 // Non-fallible instance logging (write failures go to stderr).
13 logger.trace("This trace message will not be logged due to log level");
14 logger.debug("This debug message will not be logged due to log level");
15 logger.info("Instance logger ready");
16 logger.warn("This is a warning with the instance logger");
17 logger.error("An error occurred with the instance logger");
18
19 // Fallible instance logging: returns Result so you can handle failures.
20 logger.try_trace("This is a trace message with try")?;
21 logger.try_debug("This is a debug message with try")?;
22 logger.try_info("This is an info message with try")?;
23 logger.try_warn("This is a warning with try")?;
24 logger.try_error("An error occurred with try")?;
25
26 // Instance loggers don't have macros, so format messages manually (macros target the global logger).
27 logger.try_info(&format!(
28 "Logger initialized with path: {:?} and level: {:?}",
29 logger.path(),
30 logger.level()
31 ))?;
32
33 Ok(())
34}Sourcepub fn debug(&self, msg: &str)
pub fn debug(&self, msg: &str)
Examples found in repository?
examples/instance.rs (line 14)
8fn main() -> Result<()> {
9 // Create an independent Logger instance (separate file/level) without using the global macros.
10 let logger = Logger::new("target/instance.log").with_level(LogLevel::Info);
11
12 // Non-fallible instance logging (write failures go to stderr).
13 logger.trace("This trace message will not be logged due to log level");
14 logger.debug("This debug message will not be logged due to log level");
15 logger.info("Instance logger ready");
16 logger.warn("This is a warning with the instance logger");
17 logger.error("An error occurred with the instance logger");
18
19 // Fallible instance logging: returns Result so you can handle failures.
20 logger.try_trace("This is a trace message with try")?;
21 logger.try_debug("This is a debug message with try")?;
22 logger.try_info("This is an info message with try")?;
23 logger.try_warn("This is a warning with try")?;
24 logger.try_error("An error occurred with try")?;
25
26 // Instance loggers don't have macros, so format messages manually (macros target the global logger).
27 logger.try_info(&format!(
28 "Logger initialized with path: {:?} and level: {:?}",
29 logger.path(),
30 logger.level()
31 ))?;
32
33 Ok(())
34}Sourcepub fn info(&self, msg: &str)
pub fn info(&self, msg: &str)
Examples found in repository?
examples/instance.rs (line 15)
8fn main() -> Result<()> {
9 // Create an independent Logger instance (separate file/level) without using the global macros.
10 let logger = Logger::new("target/instance.log").with_level(LogLevel::Info);
11
12 // Non-fallible instance logging (write failures go to stderr).
13 logger.trace("This trace message will not be logged due to log level");
14 logger.debug("This debug message will not be logged due to log level");
15 logger.info("Instance logger ready");
16 logger.warn("This is a warning with the instance logger");
17 logger.error("An error occurred with the instance logger");
18
19 // Fallible instance logging: returns Result so you can handle failures.
20 logger.try_trace("This is a trace message with try")?;
21 logger.try_debug("This is a debug message with try")?;
22 logger.try_info("This is an info message with try")?;
23 logger.try_warn("This is a warning with try")?;
24 logger.try_error("An error occurred with try")?;
25
26 // Instance loggers don't have macros, so format messages manually (macros target the global logger).
27 logger.try_info(&format!(
28 "Logger initialized with path: {:?} and level: {:?}",
29 logger.path(),
30 logger.level()
31 ))?;
32
33 Ok(())
34}Sourcepub fn warn(&self, msg: &str)
pub fn warn(&self, msg: &str)
Examples found in repository?
examples/instance.rs (line 16)
8fn main() -> Result<()> {
9 // Create an independent Logger instance (separate file/level) without using the global macros.
10 let logger = Logger::new("target/instance.log").with_level(LogLevel::Info);
11
12 // Non-fallible instance logging (write failures go to stderr).
13 logger.trace("This trace message will not be logged due to log level");
14 logger.debug("This debug message will not be logged due to log level");
15 logger.info("Instance logger ready");
16 logger.warn("This is a warning with the instance logger");
17 logger.error("An error occurred with the instance logger");
18
19 // Fallible instance logging: returns Result so you can handle failures.
20 logger.try_trace("This is a trace message with try")?;
21 logger.try_debug("This is a debug message with try")?;
22 logger.try_info("This is an info message with try")?;
23 logger.try_warn("This is a warning with try")?;
24 logger.try_error("An error occurred with try")?;
25
26 // Instance loggers don't have macros, so format messages manually (macros target the global logger).
27 logger.try_info(&format!(
28 "Logger initialized with path: {:?} and level: {:?}",
29 logger.path(),
30 logger.level()
31 ))?;
32
33 Ok(())
34}Sourcepub fn error(&self, msg: &str)
pub fn error(&self, msg: &str)
Examples found in repository?
examples/instance.rs (line 17)
8fn main() -> Result<()> {
9 // Create an independent Logger instance (separate file/level) without using the global macros.
10 let logger = Logger::new("target/instance.log").with_level(LogLevel::Info);
11
12 // Non-fallible instance logging (write failures go to stderr).
13 logger.trace("This trace message will not be logged due to log level");
14 logger.debug("This debug message will not be logged due to log level");
15 logger.info("Instance logger ready");
16 logger.warn("This is a warning with the instance logger");
17 logger.error("An error occurred with the instance logger");
18
19 // Fallible instance logging: returns Result so you can handle failures.
20 logger.try_trace("This is a trace message with try")?;
21 logger.try_debug("This is a debug message with try")?;
22 logger.try_info("This is an info message with try")?;
23 logger.try_warn("This is a warning with try")?;
24 logger.try_error("An error occurred with try")?;
25
26 // Instance loggers don't have macros, so format messages manually (macros target the global logger).
27 logger.try_info(&format!(
28 "Logger initialized with path: {:?} and level: {:?}",
29 logger.path(),
30 logger.level()
31 ))?;
32
33 Ok(())
34}Sourcepub fn try_trace(&self, msg: &str) -> Result<()>
pub fn try_trace(&self, msg: &str) -> Result<()>
Fallible variants of the logging methods.
Unlike info()/warn() etc., these return std::io::Result<()> so callers can handle failures.
Examples found in repository?
examples/instance.rs (line 20)
8fn main() -> Result<()> {
9 // Create an independent Logger instance (separate file/level) without using the global macros.
10 let logger = Logger::new("target/instance.log").with_level(LogLevel::Info);
11
12 // Non-fallible instance logging (write failures go to stderr).
13 logger.trace("This trace message will not be logged due to log level");
14 logger.debug("This debug message will not be logged due to log level");
15 logger.info("Instance logger ready");
16 logger.warn("This is a warning with the instance logger");
17 logger.error("An error occurred with the instance logger");
18
19 // Fallible instance logging: returns Result so you can handle failures.
20 logger.try_trace("This is a trace message with try")?;
21 logger.try_debug("This is a debug message with try")?;
22 logger.try_info("This is an info message with try")?;
23 logger.try_warn("This is a warning with try")?;
24 logger.try_error("An error occurred with try")?;
25
26 // Instance loggers don't have macros, so format messages manually (macros target the global logger).
27 logger.try_info(&format!(
28 "Logger initialized with path: {:?} and level: {:?}",
29 logger.path(),
30 logger.level()
31 ))?;
32
33 Ok(())
34}Sourcepub fn try_debug(&self, msg: &str) -> Result<()>
pub fn try_debug(&self, msg: &str) -> Result<()>
Examples found in repository?
examples/instance.rs (line 21)
8fn main() -> Result<()> {
9 // Create an independent Logger instance (separate file/level) without using the global macros.
10 let logger = Logger::new("target/instance.log").with_level(LogLevel::Info);
11
12 // Non-fallible instance logging (write failures go to stderr).
13 logger.trace("This trace message will not be logged due to log level");
14 logger.debug("This debug message will not be logged due to log level");
15 logger.info("Instance logger ready");
16 logger.warn("This is a warning with the instance logger");
17 logger.error("An error occurred with the instance logger");
18
19 // Fallible instance logging: returns Result so you can handle failures.
20 logger.try_trace("This is a trace message with try")?;
21 logger.try_debug("This is a debug message with try")?;
22 logger.try_info("This is an info message with try")?;
23 logger.try_warn("This is a warning with try")?;
24 logger.try_error("An error occurred with try")?;
25
26 // Instance loggers don't have macros, so format messages manually (macros target the global logger).
27 logger.try_info(&format!(
28 "Logger initialized with path: {:?} and level: {:?}",
29 logger.path(),
30 logger.level()
31 ))?;
32
33 Ok(())
34}Sourcepub fn try_info(&self, msg: &str) -> Result<()>
pub fn try_info(&self, msg: &str) -> Result<()>
Examples found in repository?
examples/instance.rs (line 22)
8fn main() -> Result<()> {
9 // Create an independent Logger instance (separate file/level) without using the global macros.
10 let logger = Logger::new("target/instance.log").with_level(LogLevel::Info);
11
12 // Non-fallible instance logging (write failures go to stderr).
13 logger.trace("This trace message will not be logged due to log level");
14 logger.debug("This debug message will not be logged due to log level");
15 logger.info("Instance logger ready");
16 logger.warn("This is a warning with the instance logger");
17 logger.error("An error occurred with the instance logger");
18
19 // Fallible instance logging: returns Result so you can handle failures.
20 logger.try_trace("This is a trace message with try")?;
21 logger.try_debug("This is a debug message with try")?;
22 logger.try_info("This is an info message with try")?;
23 logger.try_warn("This is a warning with try")?;
24 logger.try_error("An error occurred with try")?;
25
26 // Instance loggers don't have macros, so format messages manually (macros target the global logger).
27 logger.try_info(&format!(
28 "Logger initialized with path: {:?} and level: {:?}",
29 logger.path(),
30 logger.level()
31 ))?;
32
33 Ok(())
34}Sourcepub fn try_warn(&self, msg: &str) -> Result<()>
pub fn try_warn(&self, msg: &str) -> Result<()>
Examples found in repository?
examples/instance.rs (line 23)
8fn main() -> Result<()> {
9 // Create an independent Logger instance (separate file/level) without using the global macros.
10 let logger = Logger::new("target/instance.log").with_level(LogLevel::Info);
11
12 // Non-fallible instance logging (write failures go to stderr).
13 logger.trace("This trace message will not be logged due to log level");
14 logger.debug("This debug message will not be logged due to log level");
15 logger.info("Instance logger ready");
16 logger.warn("This is a warning with the instance logger");
17 logger.error("An error occurred with the instance logger");
18
19 // Fallible instance logging: returns Result so you can handle failures.
20 logger.try_trace("This is a trace message with try")?;
21 logger.try_debug("This is a debug message with try")?;
22 logger.try_info("This is an info message with try")?;
23 logger.try_warn("This is a warning with try")?;
24 logger.try_error("An error occurred with try")?;
25
26 // Instance loggers don't have macros, so format messages manually (macros target the global logger).
27 logger.try_info(&format!(
28 "Logger initialized with path: {:?} and level: {:?}",
29 logger.path(),
30 logger.level()
31 ))?;
32
33 Ok(())
34}Sourcepub fn try_error(&self, msg: &str) -> Result<()>
pub fn try_error(&self, msg: &str) -> Result<()>
Examples found in repository?
examples/instance.rs (line 24)
8fn main() -> Result<()> {
9 // Create an independent Logger instance (separate file/level) without using the global macros.
10 let logger = Logger::new("target/instance.log").with_level(LogLevel::Info);
11
12 // Non-fallible instance logging (write failures go to stderr).
13 logger.trace("This trace message will not be logged due to log level");
14 logger.debug("This debug message will not be logged due to log level");
15 logger.info("Instance logger ready");
16 logger.warn("This is a warning with the instance logger");
17 logger.error("An error occurred with the instance logger");
18
19 // Fallible instance logging: returns Result so you can handle failures.
20 logger.try_trace("This is a trace message with try")?;
21 logger.try_debug("This is a debug message with try")?;
22 logger.try_info("This is an info message with try")?;
23 logger.try_warn("This is a warning with try")?;
24 logger.try_error("An error occurred with try")?;
25
26 // Instance loggers don't have macros, so format messages manually (macros target the global logger).
27 logger.try_info(&format!(
28 "Logger initialized with path: {:?} and level: {:?}",
29 logger.path(),
30 logger.level()
31 ))?;
32
33 Ok(())
34}Trait Implementations§
Auto Trait Implementations§
impl Freeze for Logger
impl RefUnwindSafe for Logger
impl Send for Logger
impl Sync for Logger
impl Unpin for Logger
impl UnwindSafe for Logger
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more