captains_log/
lib.rs

1//! # captains-log
2//!
3//! A light-weight logger for rust, implementation base on the crate `log`.
4//!
5//! ## Features
6//!
7//! * Allow customize log format and time format.
8//!
9//! * Supports signal listening for log-rotate.
10//!
11//! * Supports multiple log files, each with its own log level.
12//!
13//! * Supports hook on panic.
14//!
15//! * On default supports multi-process/thread/coroutine log into the same file.
16//! Atomic line appending can be done on Linux
17//!
18//! * Provides `LogFilter` for coroutine-based programs. You can set req_id in LogFilter and
19//! output to log files
20//!
21//! * For test suits usage:
22//!
23//!   Allow dynamic reconfigure logger setting in different test function.
24//!(NOTE: currently signal_listener does not support reconfigure).
25//!
26//!   Provides an attribute macro #\[logfn\] to wrap test function. Logging test-start and test-end.
27
28
29//!
30//! ## Dependency
31//!
32//! ``` toml
33//! [dependencies]
34//! log = { version = "0.4", features = ["std", "kv_unstable"] }
35//! captains_log = "0.1"
36//! ```
37//!
38//! ## Fast setup eample:
39//!
40//! ```rust
41//! /// #[macro_use]
42//! /// extern crate captains_log;
43//! /// #[macro_use]
44//! /// extern crate log;
45//! use log::{debug, info, error};
46//! use captains_log::*;
47//! use captains_log::recipe::split_error_file_logger;
48//!
49//! let log_builder = split_error_file_logger("/tmp", "test", log::Level::Debug);
50//! setup_log(log_builder);
51//!
52//! // non-error msg will only appear in /tmp/test.log
53//! debug!("Set a course to Sol system");
54//! info!("Engage");
55//!
56//! // will appear in both /tmp/test.log and /tmp/test.log.wf
57//! error!("Engine over heat!");
58//!
59//! ```
60//!
61//! ## Customize format example
62//!
63//! ``` rust
64//! extern crate signal_hook;
65//! extern crate chrono;
66//! use captains_log::*;
67
68//! fn format_f(r: FormatRecord) -> String {
69//!     let time = r.time();
70//!     let level = r.level();
71//!     let file = r.file();
72//!     let line = r.line();
73//!     let msg = r.msg();
74//!     format!("{time}|{level}|{file}:{line}|{msg}\n").to_string()
75//! }
76//! let debug_format = LogFormat::new(
77//!     "%Y%m%d %H:%M:%S%.6f",
78//!     format_f,
79//! );
80//! let debug_file = LogFile::new(
81//!     "/tmp", "test.log", log::Level::Trace, debug_format);
82//! let config = Builder::default()
83//!     .signal(signal_hook::consts::SIGINT)
84//!     .file(debug_file);
85//!
86//! setup_log(config);
87//! ```
88
89extern crate captains_log_helper;
90extern crate log;
91extern crate signal_hook;
92
93#[macro_use]
94extern crate enum_dispatch;
95
96mod config;
97mod file_impl;
98mod formatter;
99mod log_impl;
100mod time;
101
102pub mod macros;
103pub mod recipe;
104
105mod log_filter;
106
107pub use captains_log_helper::logfn;
108pub use log::{Level as LogLevel, LevelFilter as LogLevelFilter};
109
110pub use self::{
111    config::{Builder, LogFile},
112    formatter::{FormatRecord, LogFormat},
113    log_filter::*,
114    log_impl::setup_log,
115};
116
117#[cfg(test)]
118mod tests;