pub struct LoggerBuilder { /* private fields */ }Implementations§
Source§impl LoggerBuilder
impl LoggerBuilder
Sourcepub fn new() -> Self
👎Deprecated since 0.3.0: it may be removed in the future, use Logger::builder() instead
pub fn new() -> Self
Logger::builder() insteadConstructs a LoggerBuilder.
Sourcepub fn name<S>(&mut self, name: S) -> &mut Self
pub fn name<S>(&mut self, name: S) -> &mut Self
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?
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 }Sourcepub fn level_filter(&mut self, level_filter: LevelFilter) -> &mut Self
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?
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 }Sourcepub fn sink(&mut self, sink: Arc<dyn Sink>) -> &mut Self
pub fn sink(&mut self, sink: Arc<dyn Sink>) -> &mut Self
Add a Sink.
Examples found in repository?
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
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}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}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}Sourcepub fn sinks<I>(&mut self, sinks: I) -> &mut Self
pub fn sinks<I>(&mut self, sinks: I) -> &mut Self
Add multiple Sinks.
Examples found in repository?
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 }Sourcepub fn flush_level_filter(&mut self, level_filter: LevelFilter) -> &mut Self
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?
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
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 }Sourcepub fn error_handler<F: Into<ErrorHandler>>(&mut self, handler: F) -> &mut Self
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.
Sourcepub fn build(&mut self) -> Result<Logger>
pub fn build(&mut self) -> Result<Logger>
Builds a Logger.
Examples found in repository?
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
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}Sourcepub fn build_arc(&mut self) -> Result<Arc<Logger>>
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?
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
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}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
impl Clone for LoggerBuilder
Source§fn clone(&self) -> LoggerBuilder
fn clone(&self) -> LoggerBuilder
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more