captains-log
A light-weight customizable logger implementation for rust
Features
-
Allow customize log format and time format.
-
Supports signal listening for log-rotate.
-
Supports multiple log files, each with its own log level.
-
Supports hook on panic.
-
Supports multi-process/thread/coroutines
Atomic line appending into the same file can be done on Linux
-
Fine-grain module-level log control.
Provides
LogFilterto filter specified logs on-the-fly -
API-level log handling.
Provides
LogFilterKVfor API logging with additional key.For example, you can set
req_idinLogFilterKV, and track the complete request handling procedure from log. -
For test suits usage:
Allow dynamic reconfigure logger setting in different test function.
(NOTE: currently signal_listener does not support reconfigure).
Provides an attribute macro #[logfn] to wrap test function. Logging test-start and test-end.
-
Provides a
LogParserto work on your log files.
Dependency
[]
= { = "0.4", = ["std", "kv_unstable"] }
= "0.3"
Fast setup example:
You can refer to various preset recipe in recipe module, including console & file output.
// #[macro_use]
// extern crate captains_log;
// #[macro_use]
// extern crate log;
use ;
use split_error_file_logger;
let log_builder = split_error_file_logger;
log_builder.build;
// non-error msg will only appear in /tmp/test.log
debug!;
info!;
// will appear in both /tmp/test.log and /tmp/test.log.wf
error!;
Customize format example
extern crate signal_hook;
extern crate chrono;
use *;
let debug_format = new;
let debug_file = new;
let config = default
.signal
.file;
config.build;
Fine-grain module-level log control
Place LogFilter in Arc and share among coroutines.
Log level can be changed on-the-fly.
use Arc;
use *;
set_max_level;
let logger_io = new;
let logger_req = new;
logger_io.set_level;
logger_req.set_level;
logger_debug!;
logger_debug!;
logger_error!;
API-level log handling
Request log can be track by custom key req_id, which kept in LogFilterKV.
use *;
let builder = file_logger_custom;
builder.build.expect;
let logger = new;
logger_debug!;
logger_debug!;
logger_info!;
The log will be:
[2025-06-11 14:33:08.089090][DEBUG][request.rs:67] API service started
[2025-06-11 14:33:10.099092][DEBUG][request.rs:67] Req / received (000000000000007b)
[2025-06-11 14:33:10.099232][WARN][request.rs:68] header xxx (000000000000007b)
[2025-06-11 14:33:11.009092][DEBUG][request.rs:67] Req / 200 complete (000000000000007b)