Skip to content

Commit b2e5187

Browse files
committed
logs: switch from slog to log and env_logger
1 parent 24e9ce0 commit b2e5187

File tree

14 files changed

+221
-192
lines changed

14 files changed

+221
-192
lines changed

Cargo.lock

Lines changed: 44 additions & 62 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,6 @@ serde = "1.0"
4949
serde_derive = "1.0"
5050
serde_json = "1.0"
5151
serde_regex = "0.3.0"
52-
slog = "2.4.1"
53-
slog-scope = "4"
54-
slog-term = "2"
5552
structopt = "0.2"
5653
structopt-derive = "0.2"
5754
tar = "0.4.0"
@@ -64,6 +61,8 @@ url = "1.1"
6461
walkdir = "2"
6562
warp = "0.1.9"
6663
winapi = "0.3"
64+
log = "0.4.6"
65+
env_logger = "0.6.0"
6766

6867
[dev-dependencies]
6968
assert_cmd = "0.10.1"

src/agent/results.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
use crate::agent::api::AgentApi;
22
use crate::crates::{Crate, GitHubRepo};
33
use crate::experiments::Experiment;
4-
use crate::log;
4+
use crate::logs::{self, LogStorage};
55
use crate::prelude::*;
66
use crate::results::{TestResult, WriteResults};
77
use crate::toolchain::Toolchain;
8-
use std::io::Read;
8+
use log::LevelFilter;
99
use std::ops::DerefMut;
1010
use std::sync::{Arc, Mutex};
1111

@@ -53,17 +53,15 @@ impl<'a> WriteResults for ResultsUploader<'a> {
5353
where
5454
F: FnOnce() -> Fallible<TestResult>,
5555
{
56-
let mut log_file = ::tempfile::NamedTempFile::new()?;
57-
let result = log::redirect(log_file.path(), f)?;
58-
59-
let mut buffer = Vec::new();
60-
log_file.read_to_end(&mut buffer)?;
56+
let storage = LogStorage::new(LevelFilter::Info);
57+
let result = logs::capture(&storage, f)?;
58+
let output = storage.to_string();
6159

6260
let shas = ::std::mem::replace(self.shas.lock().unwrap().deref_mut(), Vec::new());
6361

6462
info!("sending results to the crater server...");
6563
self.api
66-
.record_progress(krate, toolchain, &buffer, result, &shas)?;
64+
.record_progress(krate, toolchain, output.as_bytes(), result, &shas)?;
6765

6866
Ok(result)
6967
}

src/db/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ impl Database {
5050
}
5151

5252
let path = WORK_DIR.join(DATABASE_PATH);
53+
std::fs::create_dir_all(&*WORK_DIR)?;
5354
Database::new(SqliteConnectionManager::file(path), None)
5455
}
5556

src/lib.rs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,13 @@
11
#![recursion_limit = "256"]
22
#![allow(clippy::needless_pass_by_value, clippy::new_ret_no_self)]
33

4-
#[macro_use(slog_o, slog_info, slog_error, slog_warn)]
5-
extern crate slog;
6-
#[macro_use]
7-
extern crate slog_scope;
84
#[cfg_attr(test, macro_use)]
95
extern crate toml;
106

117
pub mod actions;
128
pub mod agent;
139
mod assets;
14-
#[macro_use]
15-
pub mod log;
10+
pub mod logs;
1611
#[macro_use]
1712
pub mod utils;
1813
pub mod config;

src/log.rs

Lines changed: 0 additions & 87 deletions
This file was deleted.

src/logs/mod.rs

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
mod storage;
2+
3+
use crate::prelude::*;
4+
use log::{Log, Metadata, Record};
5+
use std::cell::RefCell;
6+
use std::thread::LocalKey;
7+
8+
pub(crate) use self::storage::LogStorage;
9+
10+
thread_local! {
11+
static SCOPED: RefCell<Vec<Box<Log>>> = RefCell::new(Vec::new());
12+
}
13+
14+
struct MultiLogger {
15+
global: Vec<Box<Log>>,
16+
scoped: &'static LocalKey<RefCell<Vec<Box<Log>>>>,
17+
}
18+
19+
impl MultiLogger {
20+
fn new(global: Vec<Box<Log>>, scoped: &'static LocalKey<RefCell<Vec<Box<Log>>>>) -> Self {
21+
MultiLogger { global, scoped }
22+
}
23+
24+
fn each<F: FnMut(&Log)>(&self, mut f: F) {
25+
for logger in &self.global {
26+
f(logger.as_ref());
27+
}
28+
self.scoped.with(|scoped| {
29+
for logger in &*scoped.borrow() {
30+
f(logger.as_ref());
31+
}
32+
});
33+
}
34+
}
35+
36+
impl Log for MultiLogger {
37+
fn enabled(&self, metadata: &Metadata) -> bool {
38+
let mut result = false;
39+
self.each(|logger| {
40+
if logger.enabled(metadata) {
41+
result = true;
42+
}
43+
});
44+
result
45+
}
46+
47+
fn log(&self, record: &Record) {
48+
self.each(|logger| {
49+
logger.log(record);
50+
});
51+
}
52+
53+
fn flush(&self) {
54+
self.each(|logger| {
55+
logger.flush();
56+
});
57+
}
58+
}
59+
60+
pub fn capture<F, R, L>(storage: &L, f: F) -> Fallible<R>
61+
where
62+
F: FnOnce() -> Fallible<R>,
63+
L: Log + Clone + 'static,
64+
{
65+
let storage = Box::new(storage.clone());
66+
SCOPED.with(|scoped| scoped.borrow_mut().push(storage));
67+
let result = f();
68+
SCOPED.with(|scoped| {
69+
let _ = scoped.borrow_mut().pop();
70+
});
71+
result
72+
}
73+
74+
pub fn init() -> Fallible<()> {
75+
// Initialize env_logger
76+
// This doesn't use from_default_env() because it doesn't allow to override filter_module()
77+
// with the RUST_LOG environment variable
78+
let mut env = env_logger::Builder::new();
79+
env.filter_module("crater", log::LevelFilter::Info);
80+
if let Ok(content) = std::env::var("RUST_LOG") {
81+
env.parse(&content);
82+
}
83+
84+
let multi = MultiLogger::new(vec![Box::new(env.build())], &SCOPED);
85+
log::set_boxed_logger(Box::new(multi))?;
86+
log::set_max_level(log::LevelFilter::Trace);
87+
88+
Ok(())
89+
}

src/logs/storage.rs

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
use log::{Level, LevelFilter, Log, Metadata, Record};
2+
use std::fmt;
3+
use std::sync::{Arc, Mutex};
4+
5+
struct StoredRecord {
6+
level: Level,
7+
message: String,
8+
}
9+
10+
struct InnerStorage {
11+
records: Vec<StoredRecord>,
12+
}
13+
14+
#[derive(Clone)]
15+
pub(crate) struct LogStorage {
16+
inner: Arc<Mutex<InnerStorage>>,
17+
min_level: LevelFilter,
18+
}
19+
20+
impl LogStorage {
21+
pub(crate) fn new(min_level: LevelFilter) -> Self {
22+
LogStorage {
23+
inner: Arc::new(Mutex::new(InnerStorage {
24+
records: Vec::new(),
25+
})),
26+
min_level,
27+
}
28+
}
29+
}
30+
31+
impl Log for LogStorage {
32+
fn enabled(&self, metadata: &Metadata) -> bool {
33+
metadata.level() > self.min_level
34+
}
35+
36+
fn log(&self, record: &Record) {
37+
if record.level() > self.min_level {
38+
return;
39+
}
40+
let mut inner = self.inner.lock().unwrap();
41+
inner.records.push(StoredRecord {
42+
level: record.level(),
43+
message: record.args().to_string(),
44+
});
45+
}
46+
47+
fn flush(&self) {}
48+
}
49+
50+
impl fmt::Display for LogStorage {
51+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
52+
let inner = self.inner.lock().unwrap();
53+
for record in &inner.records {
54+
writeln!(f, "[{}] {}", record.level, record.message)?;
55+
}
56+
Ok(())
57+
}
58+
}

src/main.rs

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
1-
#[macro_use(slog_info)]
2-
extern crate slog;
3-
#[macro_use]
4-
extern crate slog_scope;
5-
1+
use log::info;
62
mod cli;
73

8-
use crater::{log, utils};
4+
use crater::{logs, utils};
95
use failure::Fallible;
106
use std::panic;
117
use std::process;
@@ -15,7 +11,7 @@ fn main() {
1511
// Ignore errors loading `.env` file.
1612
let _ = dotenv::dotenv();
1713

18-
let _guard = log::init();
14+
let _guard = logs::init();
1915
let success = match panic::catch_unwind(main_) {
2016
Ok(Ok(())) => true,
2117
Ok(Err(e)) => {
@@ -35,7 +31,6 @@ fn main() {
3531
"command failed"
3632
}
3733
);
38-
log::finish();
3934
process::exit(if success { 0 } else { 1 });
4035
}
4136

src/prelude.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use failure::Context;
22
pub use failure::{bail, err_msg, Fail, Fallible, ResultExt};
33
pub use lazy_static::lazy_static;
4+
pub use log::{debug, error, info, trace, warn};
45
pub use serde_derive::{Deserialize, Serialize};
56

67
pub trait FailExt {

0 commit comments

Comments
 (0)