Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 24 additions & 23 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,49 +2,50 @@
name = "ftlog"
version = "0.2.14"
edition = "2021"
authors = [ "Non-convex Tech" ]
authors = ["Non-convex Tech"]
license = "MIT OR Apache-2.0"
readme = "README.md"
repository = "https://github.com/nonconvextech/ftlog"
documentation = "https://docs.rs/ftlog"
description = """
An asynchronous logging library for high performance
"""
categories = [ "development-tools::debugging" ]
keywords = [ "logging" ]
exclude = [ ".standard-version", ".versionrc", ".github" ]
categories = ["development-tools::debugging"]
keywords = ["logging"]
exclude = [".standard-version", ".versionrc", ".github"]

[features]
default = [ "random_drop" ]
tsc = [ "minstant", "once_cell" ]
random_drop = [ "fastrand" ]
default = ["random_drop"]
tsc = ["minstant", "once_cell"]
random_drop = ["fastrand"]

[dependencies]
arc-swap = "1"
crossbeam-channel = "0.5.0"
env_filter = "0.1"
hashbrown = "0.14"
arc-swap = "1"
nohash-hasher = "0.2"
typed-builder = "0.16"

[dependencies.fastrand]
version = "2"
optional = true
[dependencies.fastrand]
version = "2"
optional = true

[dependencies.time]
version = "0.3"
features = [ "local-offset", "formatting" ]
[dependencies.log]
version = "0.4"
features = ["std", "kv_unstable"]

[dependencies.minstant]
version = "0.1"
optional = true
[dependencies.minstant]
version = "0.1"
optional = true

[dependencies.once_cell]
version = "1"
optional = true
[dependencies.once_cell]
version = "1"
optional = true

[dependencies.log]
version = "0.4"
features = [ "std", "kv_unstable" ]
[dependencies.time]
version = "0.3"
features = ["local-offset", "formatting"]

[target."cfg(target_family = \"unix\")".dependencies.tz-rs]
version = "0.6.14"
21 changes: 15 additions & 6 deletions examples/custom-format.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ use std::fmt::Display;

use ftlog::{
appender::{file::Period, FileAppender},
info, FtLogFormat, LoggerGuard,
info, FtLogFormat, LoggerGuard, Record,
};
use log::{Level, LevelFilter, Record};
use log::{Level, LevelFilter};
use time::Duration;
fn init() -> LoggerGuard {
// Custom log style.
Expand Down Expand Up @@ -41,7 +41,7 @@ fn init() -> LoggerGuard {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(&format!(
"{}@{}||{}:{}[{}] {}",
self.thread.as_ref().map(|x| x.as_str()).unwrap_or(""),
self.thread.as_deref().unwrap_or(""),
self.module_path.unwrap_or(""),
self.file.unwrap_or(""),
self.line.unwrap_or(0),
Expand Down Expand Up @@ -72,11 +72,20 @@ fn init() -> LoggerGuard {
)
// ---------- configure additional filter ----------
// write to "ftlog-appender" appender, with different level filter
.filter("ftlog::appender", "ftlog-appender", LevelFilter::Error)
.filter_with(
|_msg, level, target| target == "ftlog::appender" && level == LevelFilter::Error,
"ftlog-appender",
)
// write to root appender, but with different level filter
.filter("ftlog", None, LevelFilter::Trace)
.filter_with(
|_msg, level, target| target == "ftlog" && level == LevelFilter::Trace,
"ftlog",
)
// write to "ftlog" appender, with default level filter
.filter("ftlog::appender::file", "ftlog", None)
.filter_with(
|_msg, _level, target| target == "ftlog::appender::file",
"ftlog",
)
// ---------- configure additional appender ----------
// new appender
.appender("ftlog-appender", FileAppender::new("ftlog-appender.log"))
Expand Down
28 changes: 28 additions & 0 deletions examples/env_log.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
use ftlog::{appender::FileAppender, LoggerGuard};
use log::{info, LevelFilter};

fn init() -> LoggerGuard {
// Rotate every day, clean stale logs that were modified 7 days ago on each rotation
let writer = FileAppender::builder().path("./env_log.log").build();
ftlog::Builder::new()
// global max log level
.max_log_level(LevelFilter::Info)
.use_env_filter()
// define root appender, pass None would write to stderr
.root(writer)
// write logs in ftlog::appender to "./ftlog-appender.log" instead of "./current.log"
.try_init()
.expect("logger build or set failed")
}

fn main() {
// RUST_LOG=env_log cargo run --example env_log or RUST_LOG=info cargo run --example env_log will show log lines
let _guard = init();
info!("Hello, world!");
for i in 0..120 {
info!("running {}!", i);
info!(limit=3000i64; "limit running{} !", i);
std::thread::sleep(std::time::Duration::from_secs(1));
}
std::thread::sleep(std::time::Duration::from_secs(5));
}
9 changes: 6 additions & 3 deletions examples/ftlog.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
use ftlog::{
appender::{file::Period, FileAppender},
info, LoggerGuard,
LoggerGuard,
};
use log::LevelFilter;
use time::Duration;

fn init() -> LoggerGuard {
// Rotate every day, clean stale logs that were modified 7 days ago on each rotation
// Rotate every minute, clean stale logs that were modified 4 minutes ago on each rotation
let writer = FileAppender::builder()
.path("./current.log")
.rotate(Period::Minute)
Expand All @@ -18,7 +18,10 @@ fn init() -> LoggerGuard {
// define root appender, pass None would write to stderr
.root(writer)
// write logs in ftlog::appender to "./ftlog-appender.log" instead of "./current.log"
.filter("ftlog::appender", "ftlog-appender", LevelFilter::Error)
.filter_with(
|_msg, level, target| target == "ftlog::appender" && level == LevelFilter::Error,
"ftlog-appender",
)
.appender("ftlog-appender", FileAppender::new("ftlog-appender.log"))
.try_init()
.expect("logger build or set failed")
Expand Down
5 changes: 4 additions & 1 deletion examples/multi-dest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,10 @@ fn init() -> LoggerGuard {
Box::new(std::io::stdout()),
]))
// write logs in ftlog::appender to "./ftlog-appender.log" instead of "./current.log"
.filter("ftlog::appender", "ftlog-appender", LevelFilter::Error)
.filter_with(
|_msg, level, target| target == "ftlog::appender" && level == LevelFilter::Error,
"ftlog-appender",
)
.appender("ftlog-appender", FileAppender::new("ftlog-appender.log"))
.try_init()
.expect("logger build or set failed")
Expand Down
29 changes: 15 additions & 14 deletions src/appender/file.rs
Original file line number Diff line number Diff line change
Expand Up @@ -160,10 +160,9 @@ impl<
let del_msg = clean_expire_log(p, period, expire);
if !del_msg.is_empty() {
file.write_fmt(format_args!("Log file deleted: {}", del_msg))
.expect(&format!(
"Write msg to \"{}\" failed",
path.to_string_lossy()
));
.unwrap_or_else(|_| {
panic!("Write msg to \"{}\" failed", path.to_string_lossy())
});
}
FileAppender {
file,
Expand All @@ -185,7 +184,7 @@ impl<
OpenOptions::new()
.create(true)
.append(true)
.open(&path)
.open(path)
.unwrap(),
);
FileAppender {
Expand All @@ -207,10 +206,12 @@ impl<
.create(true)
.append(true)
.open(&builder.path)
.expect(&format!(
"Fail to create log file: {}",
builder.path.to_string_lossy()
)),
.unwrap_or_else(|_| {
panic!(
"Fail to create log file: {}",
builder.path.to_string_lossy()
)
}),
),
path: builder.path,
rotate: None,
Expand Down Expand Up @@ -295,7 +296,7 @@ impl FileAppender {
match timezone {
LogTimezone::Local => local_timezone(),
LogTimezone::Utc => UtcOffset::UTC,
LogTimezone::Fixed(offset) => offset.clone(),
LogTimezone::Fixed(offset) => *offset,
}
}

Expand Down Expand Up @@ -367,10 +368,10 @@ fn clean_expire_log(path: PathBuf, rotate_period: Period, keep_duration: Duratio
.filter(|x| {
let p = x.path();
let name = p.file_stem().unwrap().to_string_lossy();
if let Some((stem, time)) = name.rsplit_once("-") {
if let Some((stem, time)) = name.rsplit_once('-') {
let check = |(ix, x): (usize, char)| match ix {
8 => x == 'T',
_ => x.is_digit(10),
_ => x.is_ascii_digit(),
};
let len = match rotate_period {
Period::Minute => time.len() == 13,
Expand Down Expand Up @@ -422,9 +423,9 @@ impl Write for FileAppender {
let path = Self::file(&self.path, *period, &self.timezone);
// remove outdated log files
if let Some(keep_duration) = keep {
let keep_duration = keep_duration.clone();
let keep_duration = *keep_duration;
let path = self.path.clone();
let period = period.clone();
let period = *period;
std::thread::spawn(move || {
let del_msg = clean_expire_log(path, period, keep_duration);
if !del_msg.is_empty() {
Expand Down
Loading