diff --git a/CHANGELOG.md b/CHANGELOG.md index cf7a2282..79479948 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,19 @@ ## [Unreleased] +### New + +* More badges in the readme. + +### Changed + +* Use rust 2018 edition. +* Update `arcswap`, `serde-value` and `serde-xml-rs`. + +### Fixed + +* Deprecate len method on rolling_file. + ## [0.9.0] ### New diff --git a/Cargo.toml b/Cargo.toml index 191271d0..c7400af7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,7 @@ license = "MIT/Apache-2.0" repository = "https://github.com/estk/log4rs" readme = "README.md" keywords = ["logger", "log", "logging"] +edition = '2018' [features] default = ["all_components", "gzip", "file", "yaml_format"] @@ -48,7 +49,7 @@ gzip = ["flate2"] [dependencies] antidote = { version = "1.0", optional = true } -arc-swap = "0.3" +arc-swap = "0.4" chrono = { version = "0.4", optional = true } flate2 = { version = "1.0", optional = true } fnv = "1.0" @@ -57,13 +58,13 @@ log = { version = "0.4.0", features = ["std"] } log-mdc = { version = "0.1", optional = true } serde = { version = "1.0", optional = true } serde_derive = { version = "1.0", optional = true } -serde-value = { version = "0.5", optional = true } +serde-value = { version = "0.6", optional = true } thread-id = { version = "3.3", optional = true } typemap = { version = "0.3", optional = true } serde_json = { version = "1.0", optional = true } serde_yaml = { version = "0.8.4", optional = true } toml = { version = "0.5", optional = true } -serde-xml-rs = { version = "0.2", optional = true } +serde-xml-rs = { version = "0.3", optional = true } [target.'cfg(windows)'.dependencies] winapi = { version = "0.3", optional = true, features = ["handleapi", "minwindef", "processenv", "winbase", "wincon"] } diff --git a/README.md b/README.md index e991a33f..c5b0606d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,10 @@ # log4rs [![CircleCI](https://circleci.com/gh/estk/log4rs.svg?style=shield)](https://circleci.com/gh/estk/log4rs) +[![License: MIT OR Apache-2.0](https://img.shields.io/crates/l/clippy.svg)](#license) +[![crates.io](https://img.shields.io/crates/v/log4rs.svg)](https://crates.io/crates/log4rs) +[![downloads](https://img.shields.io/crates/d/shuteye.svg)](https://crates.io/crates/log4rs) +[![API](https://docs.rs/log4rs/badge.svg)](https://docs.rs/log4rs) log4rs is a highly configurable logging framework modeled after Java's Logback and log4j libraries. diff --git a/src/append/console.rs b/src/append/console.rs index fe7a3103..28ad7dc4 100644 --- a/src/append/console.rs +++ b/src/append/console.rs @@ -7,16 +7,16 @@ use std::error::Error; use std::fmt; use std::io::{self, Write}; -use append::Append; -use encode::pattern::PatternEncoder; -use encode::writer::console::{ConsoleWriter, ConsoleWriterLock}; -use encode::writer::simple::SimpleWriter; +use crate::append::Append; +use crate::encode::pattern::PatternEncoder; +use crate::encode::writer::console::{ConsoleWriter, ConsoleWriterLock}; +use crate::encode::writer::simple::SimpleWriter; #[cfg(feature = "file")] -use encode::EncoderConfig; -use encode::{self, Encode, Style}; +use crate::encode::EncoderConfig; +use crate::encode::{self, Encode, Style}; #[cfg(feature = "file")] -use file::{Deserialize, Deserializers}; -use priv_io::{StdWriter, StdWriterLock}; +use crate::file::{Deserialize, Deserializers}; +use crate::priv_io::{StdWriter, StdWriterLock}; /// The console appender's configuration. #[cfg(feature = "file")] diff --git a/src/append/file.rs b/src/append/file.rs index 830efcaa..e3c51afc 100644 --- a/src/append/file.rs +++ b/src/append/file.rs @@ -10,14 +10,14 @@ use std::fs::{self, File, OpenOptions}; use std::io::{self, BufWriter, Write}; use std::path::{Path, PathBuf}; -use append::Append; -use encode::pattern::PatternEncoder; -use encode::writer::simple::SimpleWriter; -use encode::Encode; +use crate::append::Append; +use crate::encode::pattern::PatternEncoder; +use crate::encode::writer::simple::SimpleWriter; +use crate::encode::Encode; #[cfg(feature = "file")] -use encode::EncoderConfig; +use crate::encode::EncoderConfig; #[cfg(feature = "file")] -use file::{Deserialize, Deserializers}; +use crate::file::{Deserialize, Deserializers}; /// The file appender's configuration. #[cfg(feature = "file")] diff --git a/src/append/mod.rs b/src/append/mod.rs index 24c214a7..83163171 100644 --- a/src/append/mod.rs +++ b/src/append/mod.rs @@ -11,9 +11,9 @@ use std::error::Error; use std::fmt; #[cfg(feature = "file")] -use file::Deserializable; +use crate::file::Deserializable; #[cfg(feature = "file")] -use filter::FilterConfig; +use crate::filter::FilterConfig; #[cfg(feature = "console_appender")] pub mod console; diff --git a/src/append/rolling_file/mod.rs b/src/append/rolling_file/mod.rs index e530329f..cec743ed 100644 --- a/src/append/rolling_file/mod.rs +++ b/src/append/rolling_file/mod.rs @@ -30,13 +30,13 @@ use std::fs::{self, File, OpenOptions}; use std::io::{self, BufWriter, Write}; use std::path::{Path, PathBuf}; -use append::Append; -use encode::pattern::PatternEncoder; +use crate::append::Append; +use crate::encode::pattern::PatternEncoder; #[cfg(feature = "file")] -use encode::EncoderConfig; -use encode::{self, Encode}; +use crate::encode::EncoderConfig; +use crate::encode::{self, Encode}; #[cfg(feature = "file")] -use file::{Deserialize, Deserializers}; +use crate::file::{Deserialize, Deserializers}; pub mod policy; @@ -116,10 +116,21 @@ impl<'a> LogFile<'a> { /// and adding the number of bytes written. It may be inaccurate if any /// writes have failed or if another process has modified the file /// concurrently. + #[deprecated(since = "0.9.1", note = "Please use the len_estimate function instead")] pub fn len(&self) -> u64 { self.len } + /// Returns an estimate of the log file's current size. + /// + /// This is calculated by taking the size of the log file when it is opened + /// and adding the number of bytes written. It may be inaccurate if any + /// writes have failed or if another process has modified the file + /// concurrently. + pub fn len_estimate(&self) -> u64 { + self.len + } + /// Triggers the log file to roll over. /// /// A policy must call this method when it wishes to roll the log. The @@ -332,12 +343,12 @@ mod test { use tempdir::TempDir; use super::*; - use append::rolling_file::policy::Policy; + use crate::append::rolling_file::policy::Policy; #[test] #[cfg(feature = "yaml_format")] fn deserialize() { - use file::{Deserializers, RawConfig}; + use crate::file::{Deserializers, RawConfig}; let dir = TempDir::new("deserialize").unwrap(); diff --git a/src/append/rolling_file/policy/compound/mod.rs b/src/append/rolling_file/policy/compound/mod.rs index acbbc18b..940c7fe0 100644 --- a/src/append/rolling_file/policy/compound/mod.rs +++ b/src/append/rolling_file/policy/compound/mod.rs @@ -9,11 +9,11 @@ use serde_value::Value; use std::collections::BTreeMap; use std::error::Error; -use append::rolling_file::policy::compound::roll::Roll; -use append::rolling_file::policy::Policy; -use append::rolling_file::LogFile; +use crate::append::rolling_file::policy::compound::roll::Roll; +use crate::append::rolling_file::policy::Policy; +use crate::append::rolling_file::LogFile; #[cfg(feature = "file")] -use file::{Deserialize, Deserializers}; +use crate::file::{Deserialize, Deserializers}; pub mod roll; pub mod trigger; diff --git a/src/append/rolling_file/policy/compound/roll/delete.rs b/src/append/rolling_file/policy/compound/roll/delete.rs index f7253263..3c434ece 100644 --- a/src/append/rolling_file/policy/compound/roll/delete.rs +++ b/src/append/rolling_file/policy/compound/roll/delete.rs @@ -6,9 +6,9 @@ use std::error::Error; use std::fs; use std::path::Path; -use append::rolling_file::policy::compound::roll::Roll; +use crate::append::rolling_file::policy::compound::roll::Roll; #[cfg(feature = "file")] -use file::{Deserialize, Deserializers}; +use crate::file::{Deserialize, Deserializers}; /// Configuration for the delete roller. #[cfg(feature = "file")] diff --git a/src/append/rolling_file/policy/compound/roll/fixed_window.rs b/src/append/rolling_file/policy/compound/roll/fixed_window.rs index 63b355d3..7f58d4e7 100644 --- a/src/append/rolling_file/policy/compound/roll/fixed_window.rs +++ b/src/append/rolling_file/policy/compound/roll/fixed_window.rs @@ -7,9 +7,9 @@ use std::fs; use std::io; use std::path::Path; -use append::rolling_file::policy::compound::roll::Roll; +use crate::append::rolling_file::policy::compound::roll::Roll; #[cfg(feature = "file")] -use file::{Deserialize, Deserializers}; +use crate::file::{Deserialize, Deserializers}; /// Configuration for the fixed window roller. #[cfg(feature = "file")] @@ -243,7 +243,7 @@ mod test { use tempdir::TempDir; use super::*; - use append::rolling_file::policy::compound::roll::Roll; + use crate::append::rolling_file::policy::compound::roll::Roll; #[test] fn rotation() { diff --git a/src/append/rolling_file/policy/compound/roll/mod.rs b/src/append/rolling_file/policy/compound/roll/mod.rs index b7c3bc4a..4769df28 100644 --- a/src/append/rolling_file/policy/compound/roll/mod.rs +++ b/src/append/rolling_file/policy/compound/roll/mod.rs @@ -5,7 +5,7 @@ use std::fmt; use std::path::Path; #[cfg(feature = "file")] -use file::Deserializable; +use crate::file::Deserializable; #[cfg(feature = "delete_roller")] pub mod delete; diff --git a/src/append/rolling_file/policy/compound/trigger/mod.rs b/src/append/rolling_file/policy/compound/trigger/mod.rs index 16118f11..a0c19aa8 100644 --- a/src/append/rolling_file/policy/compound/trigger/mod.rs +++ b/src/append/rolling_file/policy/compound/trigger/mod.rs @@ -3,9 +3,9 @@ use std::error::Error; use std::fmt; -use append::rolling_file::LogFile; +use crate::append::rolling_file::LogFile; #[cfg(feature = "file")] -use file::Deserializable; +use crate::file::Deserializable; #[cfg(feature = "size_trigger")] pub mod size; diff --git a/src/append/rolling_file/policy/compound/trigger/size.rs b/src/append/rolling_file/policy/compound/trigger/size.rs index 37459b97..7c351caf 100644 --- a/src/append/rolling_file/policy/compound/trigger/size.rs +++ b/src/append/rolling_file/policy/compound/trigger/size.rs @@ -8,10 +8,10 @@ use std::error::Error; #[cfg(feature = "file")] use std::fmt; -use append::rolling_file::policy::compound::trigger::Trigger; -use append::rolling_file::LogFile; +use crate::append::rolling_file::policy::compound::trigger::Trigger; +use crate::append::rolling_file::LogFile; #[cfg(feature = "file")] -use file::{Deserialize, Deserializers}; +use crate::file::{Deserialize, Deserializers}; /// Configuration for the size trigger. #[cfg(feature = "file")] @@ -116,7 +116,7 @@ impl SizeTrigger { impl Trigger for SizeTrigger { fn trigger(&self, file: &LogFile) -> Result> { - Ok(file.len() > self.limit) + Ok(file.len_estimate() > self.limit) } } diff --git a/src/append/rolling_file/policy/mod.rs b/src/append/rolling_file/policy/mod.rs index ebc94e64..1232fa79 100644 --- a/src/append/rolling_file/policy/mod.rs +++ b/src/append/rolling_file/policy/mod.rs @@ -2,9 +2,9 @@ use std::error::Error; use std::fmt; -use append::rolling_file::LogFile; +use crate::append::rolling_file::LogFile; #[cfg(feature = "file")] -use file::Deserializable; +use crate::file::Deserializable; #[cfg(feature = "compound_policy")] pub mod compound; diff --git a/src/config.rs b/src/config.rs index 64f95b1c..27421e16 100644 --- a/src/config.rs +++ b/src/config.rs @@ -6,9 +6,9 @@ use std::error; use std::fmt; use std::iter::IntoIterator; -use append::Append; -use filter::Filter; -use {ConfigPrivateExt, PrivateConfigAppenderExt}; +use crate::append::Append; +use crate::filter::Filter; +use crate::{ConfigPrivateExt, PrivateConfigAppenderExt}; /// Configuration for the root logger. #[derive(Debug)] diff --git a/src/encode/json.rs b/src/encode/json.rs index 20221ffc..4e32b782 100644 --- a/src/encode/json.rs +++ b/src/encode/json.rs @@ -37,9 +37,9 @@ use std::option; use std::thread; use thread_id; -use encode::{Encode, Write, NEWLINE}; +use crate::encode::{Encode, Write, NEWLINE}; #[cfg(feature = "file")] -use file::{Deserialize, Deserializers}; +use crate::file::{Deserialize, Deserializers}; /// The JSON encoder's configuration #[cfg(feature = "file")] @@ -178,7 +178,7 @@ mod test { use log_mdc; use super::*; - use encode::writer::simple::SimpleWriter; + use crate::encode::writer::simple::SimpleWriter; #[test] fn default() { diff --git a/src/encode/mod.rs b/src/encode/mod.rs index 0fd82aa1..d9a0c5b4 100644 --- a/src/encode/mod.rs +++ b/src/encode/mod.rs @@ -12,7 +12,7 @@ use std::fmt; use std::io; #[cfg(feature = "file")] -use file::Deserializable; +use crate::file::Deserializable; #[cfg(feature = "json_encoder")] pub mod json; diff --git a/src/encode/pattern/mod.rs b/src/encode/pattern/mod.rs index 0a061b06..6260c8a9 100644 --- a/src/encode/pattern/mod.rs +++ b/src/encode/pattern/mod.rs @@ -129,10 +129,10 @@ use std::process; use std::thread; use thread_id; -use encode::pattern::parser::{Alignment, Parameters, Parser, Piece}; -use encode::{self, Color, Encode, Style, NEWLINE}; +use crate::encode::pattern::parser::{Alignment, Parameters, Parser, Piece}; +use crate::encode::{self, Color, Encode, Style, NEWLINE}; #[cfg(feature = "file")] -use file::{Deserialize, Deserializers}; +use crate::file::{Deserialize, Deserializers}; mod parser; @@ -692,9 +692,9 @@ mod tests { use super::{Chunk, PatternEncoder}; #[cfg(feature = "simple_writer")] - use encode::writer::simple::SimpleWriter; + use crate::encode::writer::simple::SimpleWriter; #[cfg(feature = "simple_writer")] - use encode::Encode; + use crate::encode::Encode; fn error_free(encoder: &PatternEncoder) -> bool { encoder.chunks.iter().all(|c| match *c { @@ -766,7 +766,7 @@ mod tests { #[test] #[cfg(feature = "simple_writer")] - fn thread_id() { + fn thread_id_field() { thread::spawn(|| { let pw = PatternEncoder::new("{I}"); let mut buf = vec![]; diff --git a/src/encode/writer/ansi.rs b/src/encode/writer/ansi.rs index d6d34ec8..8a2be36b 100644 --- a/src/encode/writer/ansi.rs +++ b/src/encode/writer/ansi.rs @@ -2,7 +2,7 @@ //! //! Requires the `ansi_writer` feature. -use encode::{self, Color, Style}; +use crate::encode::{self, Color, Style}; use std::fmt; use std::io; @@ -85,8 +85,8 @@ mod test { use std::io::{self, Write}; use super::*; - use encode::Write as EncodeWrite; - use encode::{Color, Style}; + use crate::encode::Write as EncodeWrite; + use crate::encode::{Color, Style}; #[test] fn basic() { diff --git a/src/encode/writer/console.rs b/src/encode/writer/console.rs index 301b231c..00e76071 100644 --- a/src/encode/writer/console.rs +++ b/src/encode/writer/console.rs @@ -5,7 +5,7 @@ use std::fmt; use std::io; -use encode::{self, Style}; +use crate::encode::{self, Style}; /// An `encode::Write`r that outputs to a console. pub struct ConsoleWriter(imp::Writer); @@ -90,9 +90,9 @@ mod imp { use std::fmt; use std::io; - use encode::writer::ansi::AnsiWriter; - use encode::{self, Style}; - use priv_io::{StdWriter, StdWriterLock}; + use crate::encode::writer::ansi::AnsiWriter; + use crate::encode::{self, Style}; + use crate::priv_io::{StdWriter, StdWriterLock}; pub struct Writer(AnsiWriter); @@ -363,8 +363,8 @@ mod test { use std::io::Write; use super::*; - use encode::Write as EncodeWrite; - use encode::{Color, Style}; + use crate::encode::Write as EncodeWrite; + use crate::encode::{Color, Style}; #[test] fn basic() { diff --git a/src/encode/writer/simple.rs b/src/encode/writer/simple.rs index ed5af601..5fcf7fe4 100644 --- a/src/encode/writer/simple.rs +++ b/src/encode/writer/simple.rs @@ -2,7 +2,7 @@ //! //! Requires the `simple_writer` feature. -use encode; +use crate::encode; use std::fmt; use std::io; diff --git a/src/file.rs b/src/file.rs index aaf8655a..2465dfeb 100644 --- a/src/file.rs +++ b/src/file.rs @@ -101,8 +101,10 @@ use std::sync::Arc; use std::time::Duration; use typemap::{Key, ShareCloneMap}; -use append::AppenderConfig; -use config; +use crate::append::{self, AppenderConfig}; +use crate::config; +use crate::encode; +use crate::filter; /// A trait implemented by traits which are deserializable. pub trait Deserializable: 'static { @@ -171,52 +173,49 @@ impl Default for Deserializers { let mut d = Deserializers::empty(); #[cfg(feature = "console_appender")] - d.insert("console", ::append::console::ConsoleAppenderDeserializer); + d.insert("console", append::console::ConsoleAppenderDeserializer); #[cfg(feature = "file_appender")] - d.insert("file", ::append::file::FileAppenderDeserializer); + d.insert("file", append::file::FileAppenderDeserializer); #[cfg(feature = "rolling_file_appender")] d.insert( "rolling_file", - ::append::rolling_file::RollingFileAppenderDeserializer, + append::rolling_file::RollingFileAppenderDeserializer, ); #[cfg(feature = "compound_policy")] d.insert( "compound", - ::append::rolling_file::policy::compound::CompoundPolicyDeserializer, + append::rolling_file::policy::compound::CompoundPolicyDeserializer, ); #[cfg(feature = "delete_roller")] d.insert( "delete", - ::append::rolling_file::policy::compound::roll::delete::DeleteRollerDeserializer, + append::rolling_file::policy::compound::roll::delete::DeleteRollerDeserializer, ); #[cfg(feature = "fixed_window_roller")] d.insert( "fixed_window", - ::append::rolling_file::policy::compound::roll::fixed_window::FixedWindowRollerDeserializer, + append::rolling_file::policy::compound::roll::fixed_window::FixedWindowRollerDeserializer, ); #[cfg(feature = "size_trigger")] d.insert( "size", - ::append::rolling_file::policy::compound::trigger::size::SizeTriggerDeserializer, + append::rolling_file::policy::compound::trigger::size::SizeTriggerDeserializer, ); #[cfg(feature = "json_encoder")] - d.insert("json", ::encode::json::JsonEncoderDeserializer); + d.insert("json", encode::json::JsonEncoderDeserializer); #[cfg(feature = "pattern_encoder")] - d.insert("pattern", ::encode::pattern::PatternEncoderDeserializer); + d.insert("pattern", encode::pattern::PatternEncoderDeserializer); #[cfg(feature = "threshold_filter")] - d.insert( - "threshold", - ::filter::threshold::ThresholdFilterDeserializer, - ); + d.insert("threshold", filter::threshold::ThresholdFilterDeserializer); d } @@ -613,7 +612,7 @@ loggers: "#; - let config: RawConfigXml = ::serde_xml_rs::deserialize(cfg.as_bytes()).unwrap(); + let config: RawConfigXml = ::serde_xml_rs::from_reader(cfg.as_bytes()).unwrap(); let config: RawConfig = config.into(); let errors = config.appenders_lossy(&Deserializers::new()).1; println!("{:?}", errors); diff --git a/src/filter/mod.rs b/src/filter/mod.rs index 14646003..35286d55 100644 --- a/src/filter/mod.rs +++ b/src/filter/mod.rs @@ -10,7 +10,7 @@ use std::collections::BTreeMap; use std::fmt; #[cfg(feature = "file")] -use file::Deserializable; +use crate::file::Deserializable; #[cfg(feature = "threshold_filter")] pub mod threshold; diff --git a/src/filter/threshold.rs b/src/filter/threshold.rs index 650e6ae6..01cafcf3 100644 --- a/src/filter/threshold.rs +++ b/src/filter/threshold.rs @@ -7,8 +7,8 @@ use log::{LevelFilter, Record}; use std::error::Error; #[cfg(feature = "file")] -use file::{Deserialize, Deserializers}; -use filter::{Filter, Response}; +use crate::file::{Deserialize, Deserializers}; +use crate::filter::{Filter, Response}; /// The threshold filter's configuration. #[cfg(feature = "file")] diff --git a/src/lib.rs b/src/lib.rs index 96b6e26a..5c5dc645 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -218,11 +218,11 @@ use std::io::prelude::*; use std::sync::Arc; #[cfg(feature = "file")] -pub use priv_file::{init_file, load_config_file, Error}; +pub use crate::priv_file::{init_file, load_config_file, Error}; -use append::Append; -use config::Config; -use filter::Filter; +use crate::append::Append; +use crate::config::Config; +use crate::filter::Filter; pub mod append; pub mod config; @@ -401,21 +401,21 @@ impl Logger { /// Set the max log level above which everything will be filtered. pub fn max_log_level(&self) -> LevelFilter { - self.0.lease().root.max_log_level() + self.0.load().root.max_log_level() } } impl log::Log for Logger { fn enabled(&self, metadata: &Metadata) -> bool { self.0 - .lease() + .load() .root .find(metadata.target()) .enabled(metadata.level()) } fn log(&self, record: &log::Record) { - let shared = self.0.lease(); + let shared = self.0.load(); shared .root .find(record.target()) @@ -423,7 +423,7 @@ impl log::Log for Logger { } fn flush(&self) { - for appender in &self.0.lease().appenders { + for appender in &self.0.load().appenders { appender.flush(); } } diff --git a/src/priv_file.rs b/src/priv_file.rs index 89209585..0e961446 100644 --- a/src/priv_file.rs +++ b/src/priv_file.rs @@ -7,11 +7,11 @@ use std::path::{Path, PathBuf}; use std::thread; use std::time::{Duration, SystemTime}; -use config::Config; +use crate::config::Config; #[cfg(feature = "xml_format")] -use file::RawConfigXml; -use file::{Deserializers, RawConfig}; -use {handle_error, init_config, Handle}; +use crate::file::RawConfigXml; +use crate::file::{Deserializers, RawConfig}; +use crate::{handle_error, init_config, Handle}; /// Initializes the global logger as a log4rs logger configured via a file. /// @@ -157,7 +157,7 @@ impl Format { } } - fn parse(&self, source: &str) -> Result> { + fn parse(&self, source: &str) -> Result> { match *self { #[cfg(feature = "yaml_format")] Format::Yaml => ::serde_yaml::from_str(source).map_err(Into::into), @@ -166,9 +166,9 @@ impl Format { #[cfg(feature = "toml_format")] Format::Toml => ::toml::from_str(source).map_err(Into::into), #[cfg(feature = "xml_format")] - Format::Xml => ::serde_xml_rs::deserialize::<_, RawConfigXml>(source.as_bytes()) + Format::Xml => ::serde_xml_rs::from_reader::<_, RawConfigXml>(source.as_bytes()) .map(Into::into) - .map_err(Into::into), + .map_err(|e| e.to_string().into()), } } }