Конфигурация логирования
Включение уровней логирования для каждого модуля
Крейты с двумя модулями foo
и вложенным foo::bar
с директивами логирования,
управляемыми отдельно с помощью переменной окружения RUST_LOG
.
#[macro_use] extern crate log; extern crate env_logger; mod foo { mod bar { pub fn run() { warn!("[bar] warn"); info!("[bar] info"); debug!("[bar] debug"); } } pub fn run() { warn!("[foo] warn"); info!("[foo] info"); debug!("[foo] debug"); bar::run(); } } fn main() { env_logger::init(); warn!("[root] warn"); info!("[root] info"); debug!("[root] debug"); foo::run(); }
Переменная среды RUST_LOG
управляет выводом env_logger
.
Объявления модуля принимают разделённые запятыми записи, отформатированные как
path::to::module=log_level
. Запустите приложение test
следующим образом:
RUST_LOG="warn,test::foo=info,test::foo::bar=debug" ./test
Устанавливает по умолчанию log::Level
в warn
, модуль foo
и модуль foo::bar
в info
и debug
.
WARN:test: [root] warn
WARN:test::foo: [foo] warn
INFO:test::foo: [foo] info
WARN:test::foo::bar: [bar] warn
INFO:test::foo::bar: [bar] info
DEBUG:test::foo::bar: [bar] debug
Использование переменной среды для настройки логирования
Структура Builder
настраивает логирование.
Структура Builder::parse
анализирует содержимое переменной среды MY_APP_LOG
в форме синтаксиса RUST_LOG
. Затем Builder::init
инициализирует логгер.
Все эти шаги обычно выполняются внутри с помощью env_logger::init
.
#[macro_use] extern crate log; extern crate env_logger; use std::env; use env_logger::Builder; fn main() { Builder::new() .parse(&env::var("MY_APP_LOG").unwrap_or_default()) .init(); info!("informational message"); warn!("warning message"); error!("this is an error {}", "message"); }
Включить метку времени в сообщения лога
Создаёт пользовательскую конфигурацию логгера с помощью Builder
.
Каждая запись в журнале вызывает Local::now
для получения текущего
DateTime
в местном часовом поясе и использует метод DateTime::format
со strftime::specifiers
для форматирования метки времени, используемой в конечном журнале.
В примере вызывается Builder::format
для установки замыкания, которое форматирует каждый
текст сообщения с отметкой времени Record::level
и телом (Record::args
).
#[macro_use] extern crate log; extern crate chrono; extern crate env_logger; use std::io::Write; use chrono::Local; use env_logger::Builder; use log::LevelFilter; fn main() { Builder::new() .format(|buf, record| { writeln!(buf, "{} [{}] - {}", Local::now().format("%Y-%m-%dT%H:%M:%S"), record.level(), record.args() ) }) .filter(None, LevelFilter::Info) .init(); warn!("warn"); info!("info"); debug!("debug"); }
вывод stderr будет содержать
2017-05-22T21:57:06 [WARN] - warn
2017-05-22T21:57:06 [INFO] - info
Логирование сообщений в пользовательское место
Крейт log4rs настраивает вывод журнала в пользовательское место. log4rs может использовать либо внешний файл YAML, либо программную конфигурацию.
Создайте конфигурацию логов с помощью log4rs::append::file::FileAppender
.
Appender определяет место назначения логирования. Конфигурация продолжается кодированием
формата одной записи с использованием пользовательского шаблона из
log4rs::encode::pattern
. Конфигурация присваивается log4rs::config::Config
и устанавливается по умолчанию log::LevelFilter
.
#[macro_use] extern crate error_chain; #[macro_use] extern crate log; extern crate log4rs; use log::LevelFilter; use log4rs::append::file::FileAppender; use log4rs::encode::pattern::PatternEncoder; use log4rs::config::{Appender, Config, Root}; error_chain! { foreign_links { Io(std::io::Error); LogConfig(log4rs::config::Errors); SetLogger(log::SetLoggerError); } } fn main() -> Result<()> { let logfile = FileAppender::builder() .encoder(Box::new(PatternEncoder::new("{l} - {m}\n"))) .build("log/output.log")?; let config = Config::builder() .appender(Appender::builder().build("logfile", Box::new(logfile))) .build(Root::builder() .appender("logfile") .build(LevelFilter::Info))?; log4rs::init_config(config)?; info!("Hello, world!"); Ok(()) }