LoggerBuilder

Struct LoggerBuilder 

Source
pub struct LoggerBuilder { /* private fields */ }

Implementations§

Source§

impl LoggerBuilder

Source

pub fn new() -> Self

👎Deprecated since 0.3.0: it may be removed in the future, use Logger::builder() instead

Constructs a LoggerBuilder.

Source

pub fn name<S>(&mut self, name: S) -> &mut Self
where S: Into<String>,

Sets the name of the logger.

This parameter is optional, and defaults to None.

§Requirements

A logger name should not contain any of these characters: , = * ? $ { } " ' ;, and cannot start or end with a whitespace.

Otherwise, LoggerBuilder::build will return an error.

Examples found in repository?
examples/03-logger.rs (line 46)
41    fn new(all_log_sink: Arc<dyn Sink>) -> Result<Self, Box<dyn std::error::Error>> {
42        let path = env::current_exe()?.with_file_name("db.log");
43        let db_file_sink = FileSink::builder().path(path).build_arc()?;
44
45        let logger = Logger::builder()
46            .name("database")
47            .level_filter(LevelFilter::All)
48            .flush_level_filter(LevelFilter::MoreSevereEqual(Level::Warn))
49            .sinks([all_log_sink, db_file_sink])
50            .build()?;
51        Ok(Self { logger })
52    }
Source

pub fn level_filter(&mut self, level_filter: LevelFilter) -> &mut Self

Sets the log level filter.

This parameter is optional, and defaults to MoreSevereEqual(Info).

Examples found in repository?
examples/03-logger.rs (line 19)
8fn main() -> Result<(), Box<dyn std::error::Error>> {
9    // `spdlog-rs` has a global default logger and logs will be processed by it
10    // by default, You can configure it.
11    let default_logger = spdlog::default_logger();
12    default_logger.set_level_filter(LevelFilter::All);
13
14    // Or completely replace it with a new one.
15    let path = env::current_exe()?.with_file_name("all.log");
16    let file_sink = FileSink::builder().path(path).build_arc()?;
17
18    let new_logger = Logger::builder()
19        .level_filter(LevelFilter::All)
20        .flush_level_filter(LevelFilter::MoreSevereEqual(Level::Warn))
21        .sink(file_sink.clone())
22        .build_arc()?;
23    new_logger.set_flush_period(Some(Duration::from_secs(3)));
24    spdlog::set_default_logger(new_logger);
25
26    info!("this log will be written to the file `all.log`");
27
28    // In addition to having the global default logger, more loggers are allowed to
29    // be configured, stored and used independently.
30    let db = AppDatabase::new(file_sink)?;
31    db.write_i32(114514);
32
33    Ok(())
34}
35
36struct AppDatabase {
37    logger: Logger,
38}
39
40impl AppDatabase {
41    fn new(all_log_sink: Arc<dyn Sink>) -> Result<Self, Box<dyn std::error::Error>> {
42        let path = env::current_exe()?.with_file_name("db.log");
43        let db_file_sink = FileSink::builder().path(path).build_arc()?;
44
45        let logger = Logger::builder()
46            .name("database")
47            .level_filter(LevelFilter::All)
48            .flush_level_filter(LevelFilter::MoreSevereEqual(Level::Warn))
49            .sinks([all_log_sink, db_file_sink])
50            .build()?;
51        Ok(Self { logger })
52    }
Source

pub fn sink(&mut self, sink: Arc<dyn Sink>) -> &mut Self

Add a Sink.

Examples found in repository?
examples/02-file.rs (line 22)
18fn configure_file_logger() -> Result<(), Box<dyn std::error::Error>> {
19    let path = env::current_exe()?.with_file_name("file.log");
20
21    let file_sink = FileSink::builder().path(path).build_arc()?;
22    let new_logger = Logger::builder().sink(file_sink).build_arc()?;
23    spdlog::set_default_logger(new_logger);
24
25    info!("this log will be written to the file `all.log`");
26
27    Ok(())
28}
29
30fn configure_rotating_daily_file_logger() -> Result<(), Box<dyn std::error::Error>> {
31    let path = env::current_exe()?.with_file_name("rotating_daily.log");
32
33    let file_sink = RotatingFileSink::builder()
34        .base_path(path)
35        .rotation_policy(RotationPolicy::Daily { hour: 0, minute: 0 })
36        .build_arc()?;
37    let new_logger = Logger::builder().sink(file_sink).build_arc()?;
38    spdlog::set_default_logger(new_logger);
39
40    info!("this log will be written to the file `rotating_daily.log`, and the file will be rotated daily at 00:00");
41
42    Ok(())
43}
44
45fn configure_rotating_size_file_logger() -> Result<(), Box<dyn std::error::Error>> {
46    let path = env::current_exe()?.with_file_name("rotating_size.log");
47
48    let file_sink = RotatingFileSink::builder()
49        .base_path(path)
50        .rotation_policy(RotationPolicy::FileSize(1024))
51        .build_arc()?;
52    let new_logger = Logger::builder().sink(file_sink).build_arc()?;
53    spdlog::set_default_logger(new_logger);
54
55    info!("this log will be written to the file `rotating_size.log`, and the file will be rotated when its size reaches 1024 bytes");
56
57    Ok(())
58}
59
60fn configure_rotating_hourly_file_logger() -> Result<(), Box<dyn std::error::Error>> {
61    let path = env::current_exe()?.with_file_name("rotating_hourly.log");
62
63    let file_sink = RotatingFileSink::builder()
64        .base_path(path)
65        .rotation_policy(RotationPolicy::Hourly)
66        .build_arc()?;
67    let new_logger = Logger::builder().sink(file_sink).build_arc()?;
68    spdlog::set_default_logger(new_logger);
69
70    info!("this log will be written to the file `rotating_hourly.log`, and the file will be rotated every hour");
71
72    Ok(())
73}
74
75fn configure_rotating_period_file_logger() -> Result<(), Box<dyn std::error::Error>> {
76    let path = env::current_exe()?.with_file_name("rotating_period.log");
77
78    let file_sink = RotatingFileSink::builder()
79        .base_path(path)
80        .rotation_policy(RotationPolicy::Period(Duration::from_secs(
81            60 * 90, // 90 minutes
82        )))
83        .build_arc()?;
84    let new_logger = Logger::builder().sink(file_sink).build_arc()?;
85    spdlog::set_default_logger(new_logger);
86
87    info!("this log will be written to the file `rotating_period.log`, and the file will be rotated every 1.5 hours");
88
89    Ok(())
90}
More examples
Hide additional examples
examples/07-async.rs (line 16)
8fn main() -> Result<(), Box<dyn std::error::Error>> {
9    let path = env::current_exe()?.with_file_name("async.log");
10    let file_sink = FileSink::builder().path(path).build_arc()?;
11
12    // AsyncPoolSink is a combined sink which wraps other sinks
13    let async_pool_sink = AsyncPoolSink::builder().sink(file_sink).build_arc()?;
14
15    let async_logger = Logger::builder()
16        .sink(async_pool_sink)
17        .flush_level_filter(LevelFilter::All)
18        .build_arc()?;
19
20    info!(logger: async_logger, "Hello, async!");
21
22    Ok(())
23}
examples/05-sink.rs (line 52)
50fn main() -> Result<(), Box<dyn std::error::Error>> {
51    let my_sink = Arc::new(CollectVecSink::new());
52    let example = Logger::builder().sink(my_sink.clone()).build()?;
53
54    info!(logger: example, "Hello, world!");
55    warn!(logger: example, "Meow~");
56
57    let collected = my_sink.collected();
58    println!("collected:\n{collected:#?}");
59
60    assert_eq!(collected.len(), 2);
61    assert!(collected[0].contains("[info]") && collected[0].contains("Hello, world!"));
62    assert!(collected[1].contains("[warn]") && collected[1].contains("Meow~"));
63
64    Ok(())
65}
examples/03-logger.rs (line 21)
8fn main() -> Result<(), Box<dyn std::error::Error>> {
9    // `spdlog-rs` has a global default logger and logs will be processed by it
10    // by default, You can configure it.
11    let default_logger = spdlog::default_logger();
12    default_logger.set_level_filter(LevelFilter::All);
13
14    // Or completely replace it with a new one.
15    let path = env::current_exe()?.with_file_name("all.log");
16    let file_sink = FileSink::builder().path(path).build_arc()?;
17
18    let new_logger = Logger::builder()
19        .level_filter(LevelFilter::All)
20        .flush_level_filter(LevelFilter::MoreSevereEqual(Level::Warn))
21        .sink(file_sink.clone())
22        .build_arc()?;
23    new_logger.set_flush_period(Some(Duration::from_secs(3)));
24    spdlog::set_default_logger(new_logger);
25
26    info!("this log will be written to the file `all.log`");
27
28    // In addition to having the global default logger, more loggers are allowed to
29    // be configured, stored and used independently.
30    let db = AppDatabase::new(file_sink)?;
31    db.write_i32(114514);
32
33    Ok(())
34}
Source

pub fn sinks<I>(&mut self, sinks: I) -> &mut Self
where I: IntoIterator<Item = Arc<dyn Sink>>,

Add multiple Sinks.

Examples found in repository?
examples/03-logger.rs (line 49)
41    fn new(all_log_sink: Arc<dyn Sink>) -> Result<Self, Box<dyn std::error::Error>> {
42        let path = env::current_exe()?.with_file_name("db.log");
43        let db_file_sink = FileSink::builder().path(path).build_arc()?;
44
45        let logger = Logger::builder()
46            .name("database")
47            .level_filter(LevelFilter::All)
48            .flush_level_filter(LevelFilter::MoreSevereEqual(Level::Warn))
49            .sinks([all_log_sink, db_file_sink])
50            .build()?;
51        Ok(Self { logger })
52    }
Source

pub fn flush_level_filter(&mut self, level_filter: LevelFilter) -> &mut Self

Sets the flush level filter.

This parameter is optional, and defaults to LevelFilter::Off.

See the documentation of Logger::set_flush_level_filter for the description of this parameter.

Examples found in repository?
examples/07-async.rs (line 17)
8fn main() -> Result<(), Box<dyn std::error::Error>> {
9    let path = env::current_exe()?.with_file_name("async.log");
10    let file_sink = FileSink::builder().path(path).build_arc()?;
11
12    // AsyncPoolSink is a combined sink which wraps other sinks
13    let async_pool_sink = AsyncPoolSink::builder().sink(file_sink).build_arc()?;
14
15    let async_logger = Logger::builder()
16        .sink(async_pool_sink)
17        .flush_level_filter(LevelFilter::All)
18        .build_arc()?;
19
20    info!(logger: async_logger, "Hello, async!");
21
22    Ok(())
23}
More examples
Hide additional examples
examples/03-logger.rs (line 20)
8fn main() -> Result<(), Box<dyn std::error::Error>> {
9    // `spdlog-rs` has a global default logger and logs will be processed by it
10    // by default, You can configure it.
11    let default_logger = spdlog::default_logger();
12    default_logger.set_level_filter(LevelFilter::All);
13
14    // Or completely replace it with a new one.
15    let path = env::current_exe()?.with_file_name("all.log");
16    let file_sink = FileSink::builder().path(path).build_arc()?;
17
18    let new_logger = Logger::builder()
19        .level_filter(LevelFilter::All)
20        .flush_level_filter(LevelFilter::MoreSevereEqual(Level::Warn))
21        .sink(file_sink.clone())
22        .build_arc()?;
23    new_logger.set_flush_period(Some(Duration::from_secs(3)));
24    spdlog::set_default_logger(new_logger);
25
26    info!("this log will be written to the file `all.log`");
27
28    // In addition to having the global default logger, more loggers are allowed to
29    // be configured, stored and used independently.
30    let db = AppDatabase::new(file_sink)?;
31    db.write_i32(114514);
32
33    Ok(())
34}
35
36struct AppDatabase {
37    logger: Logger,
38}
39
40impl AppDatabase {
41    fn new(all_log_sink: Arc<dyn Sink>) -> Result<Self, Box<dyn std::error::Error>> {
42        let path = env::current_exe()?.with_file_name("db.log");
43        let db_file_sink = FileSink::builder().path(path).build_arc()?;
44
45        let logger = Logger::builder()
46            .name("database")
47            .level_filter(LevelFilter::All)
48            .flush_level_filter(LevelFilter::MoreSevereEqual(Level::Warn))
49            .sinks([all_log_sink, db_file_sink])
50            .build()?;
51        Ok(Self { logger })
52    }
Source

pub fn error_handler<F: Into<ErrorHandler>>(&mut self, handler: F) -> &mut Self

Sets the error handler.

This parameter is optional, and defaults to ErrorHandler::default().

See the documentation of Logger::set_error_handler for the description of this parameter.

Source

pub fn build(&mut self) -> Result<Logger>

Builds a Logger.

Examples found in repository?
examples/03-logger.rs (line 50)
41    fn new(all_log_sink: Arc<dyn Sink>) -> Result<Self, Box<dyn std::error::Error>> {
42        let path = env::current_exe()?.with_file_name("db.log");
43        let db_file_sink = FileSink::builder().path(path).build_arc()?;
44
45        let logger = Logger::builder()
46            .name("database")
47            .level_filter(LevelFilter::All)
48            .flush_level_filter(LevelFilter::MoreSevereEqual(Level::Warn))
49            .sinks([all_log_sink, db_file_sink])
50            .build()?;
51        Ok(Self { logger })
52    }
More examples
Hide additional examples
examples/05-sink.rs (line 52)
50fn main() -> Result<(), Box<dyn std::error::Error>> {
51    let my_sink = Arc::new(CollectVecSink::new());
52    let example = Logger::builder().sink(my_sink.clone()).build()?;
53
54    info!(logger: example, "Hello, world!");
55    warn!(logger: example, "Meow~");
56
57    let collected = my_sink.collected();
58    println!("collected:\n{collected:#?}");
59
60    assert_eq!(collected.len(), 2);
61    assert!(collected[0].contains("[info]") && collected[0].contains("Hello, world!"));
62    assert!(collected[1].contains("[warn]") && collected[1].contains("Meow~"));
63
64    Ok(())
65}
Source

pub fn build_arc(&mut self) -> Result<Arc<Logger>>

Builds a Arc<Logger>.

This is a shorthand method for .build().map(Arc::new).

§Notes

Unlike Sink, which almost always needs to work with Arc. Logger can be used directly in logging macros without Arc. So when Arc<Logger> is not needed, users should just call LoggerBuilder::build to get a Logger without Arc.

Examples found in repository?
examples/02-file.rs (line 22)
18fn configure_file_logger() -> Result<(), Box<dyn std::error::Error>> {
19    let path = env::current_exe()?.with_file_name("file.log");
20
21    let file_sink = FileSink::builder().path(path).build_arc()?;
22    let new_logger = Logger::builder().sink(file_sink).build_arc()?;
23    spdlog::set_default_logger(new_logger);
24
25    info!("this log will be written to the file `all.log`");
26
27    Ok(())
28}
29
30fn configure_rotating_daily_file_logger() -> Result<(), Box<dyn std::error::Error>> {
31    let path = env::current_exe()?.with_file_name("rotating_daily.log");
32
33    let file_sink = RotatingFileSink::builder()
34        .base_path(path)
35        .rotation_policy(RotationPolicy::Daily { hour: 0, minute: 0 })
36        .build_arc()?;
37    let new_logger = Logger::builder().sink(file_sink).build_arc()?;
38    spdlog::set_default_logger(new_logger);
39
40    info!("this log will be written to the file `rotating_daily.log`, and the file will be rotated daily at 00:00");
41
42    Ok(())
43}
44
45fn configure_rotating_size_file_logger() -> Result<(), Box<dyn std::error::Error>> {
46    let path = env::current_exe()?.with_file_name("rotating_size.log");
47
48    let file_sink = RotatingFileSink::builder()
49        .base_path(path)
50        .rotation_policy(RotationPolicy::FileSize(1024))
51        .build_arc()?;
52    let new_logger = Logger::builder().sink(file_sink).build_arc()?;
53    spdlog::set_default_logger(new_logger);
54
55    info!("this log will be written to the file `rotating_size.log`, and the file will be rotated when its size reaches 1024 bytes");
56
57    Ok(())
58}
59
60fn configure_rotating_hourly_file_logger() -> Result<(), Box<dyn std::error::Error>> {
61    let path = env::current_exe()?.with_file_name("rotating_hourly.log");
62
63    let file_sink = RotatingFileSink::builder()
64        .base_path(path)
65        .rotation_policy(RotationPolicy::Hourly)
66        .build_arc()?;
67    let new_logger = Logger::builder().sink(file_sink).build_arc()?;
68    spdlog::set_default_logger(new_logger);
69
70    info!("this log will be written to the file `rotating_hourly.log`, and the file will be rotated every hour");
71
72    Ok(())
73}
74
75fn configure_rotating_period_file_logger() -> Result<(), Box<dyn std::error::Error>> {
76    let path = env::current_exe()?.with_file_name("rotating_period.log");
77
78    let file_sink = RotatingFileSink::builder()
79        .base_path(path)
80        .rotation_policy(RotationPolicy::Period(Duration::from_secs(
81            60 * 90, // 90 minutes
82        )))
83        .build_arc()?;
84    let new_logger = Logger::builder().sink(file_sink).build_arc()?;
85    spdlog::set_default_logger(new_logger);
86
87    info!("this log will be written to the file `rotating_period.log`, and the file will be rotated every 1.5 hours");
88
89    Ok(())
90}
More examples
Hide additional examples
examples/07-async.rs (line 18)
8fn main() -> Result<(), Box<dyn std::error::Error>> {
9    let path = env::current_exe()?.with_file_name("async.log");
10    let file_sink = FileSink::builder().path(path).build_arc()?;
11
12    // AsyncPoolSink is a combined sink which wraps other sinks
13    let async_pool_sink = AsyncPoolSink::builder().sink(file_sink).build_arc()?;
14
15    let async_logger = Logger::builder()
16        .sink(async_pool_sink)
17        .flush_level_filter(LevelFilter::All)
18        .build_arc()?;
19
20    info!(logger: async_logger, "Hello, async!");
21
22    Ok(())
23}
examples/03-logger.rs (line 22)
8fn main() -> Result<(), Box<dyn std::error::Error>> {
9    // `spdlog-rs` has a global default logger and logs will be processed by it
10    // by default, You can configure it.
11    let default_logger = spdlog::default_logger();
12    default_logger.set_level_filter(LevelFilter::All);
13
14    // Or completely replace it with a new one.
15    let path = env::current_exe()?.with_file_name("all.log");
16    let file_sink = FileSink::builder().path(path).build_arc()?;
17
18    let new_logger = Logger::builder()
19        .level_filter(LevelFilter::All)
20        .flush_level_filter(LevelFilter::MoreSevereEqual(Level::Warn))
21        .sink(file_sink.clone())
22        .build_arc()?;
23    new_logger.set_flush_period(Some(Duration::from_secs(3)));
24    spdlog::set_default_logger(new_logger);
25
26    info!("this log will be written to the file `all.log`");
27
28    // In addition to having the global default logger, more loggers are allowed to
29    // be configured, stored and used independently.
30    let db = AppDatabase::new(file_sink)?;
31    db.write_i32(114514);
32
33    Ok(())
34}

Trait Implementations§

Source§

impl Clone for LoggerBuilder

Source§

fn clone(&self) -> LoggerBuilder

Returns a duplicate of the value. Read more
1.0.0§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more

Auto Trait Implementations§

Blanket Implementations§

§

impl<T> Any for T
where T: 'static + ?Sized,

§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> Borrow<T> for T
where T: ?Sized,

§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
§

impl<T> BorrowMut<T> for T
where T: ?Sized,

§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneToUninit for T
where T: Clone,

§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

§

impl<T> From<T> for T

§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T, U> Into<U> for T
where U: From<T>,

§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.