Конфигурация логирования

Включение уровней логирования для каждого модуля

log-badge env_logger-badge cat-debugging-badge

Крейты с двумя модулями 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

Использование переменной среды для настройки логирования

log-badge env_logger-badge cat-debugging-badge

Структура 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");
}

Включить метку времени в сообщения лога

log-badge env_logger-badge chrono-badge cat-debugging-badge

Создаёт пользовательскую конфигурацию логгера с помощью 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

Логирование сообщений в пользовательское место

log-badge log4rs-badge cat-debugging-badge

Крейт 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(())
}