Логирование в Rust: обзор лучших библиотек и решений

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Логирование для Rust: лучшие библиотеки и инструменты

Логирование — неотъемлемая часть разработки любого серьёзного приложения. В экосистеме Rust существует несколько зрелых решений, которые позволяют гибко управлять выводом сообщений, задавать уровни важности и форматы. В этой статье мы рассмотрим самые популярные библиотеки для логирования в Rust, их особенности и приведём примеры использования.

1. Базовый трейт log

Библиотека log (crate log) — это основа для всех систем логирования в Rust. Она предоставляет абстрактный трейт Log и макросы (info!, warn!, error!, debug!, trace!). Сама по себе она не выводит данные — для этого нужна реализация (backend).

// Cargo.toml
// [dependencies]
// log = "0.4"

use log::{info, warn, error};

fn main() {
    info!("Приложение запущено");
    warn!("Низкий запас памяти: {} MB", 128);
    error!("Ошибка подключения к базе данных");
}

Уровни логирования по возрастанию важности: trace, debug, info, warn, error. По умолчанию выводятся только сообщения уровня info и выше.

2. env_logger — простой и популярный выбор

env_logger — самая распространённая реализация трейта Log. Она настраивается через переменную окружения RUST_LOG и выводит сообщения в стандартный поток ошибок (stderr).

// Cargo.toml
// [dependencies]
// log = "0.4"
// env_logger = "0.10"

use log::info;

fn main() {
    env_logger::init();
    info!("env_logger инициализирован");
}

// Запуск: RUST_LOG=info cargo run

Особенности:

  • Минимальная настройка — достаточно одной строки env_logger::init().
  • Фильтрация по модулям: RUST_LOG=my_crate=debug,other_crate=info.
  • Поддержка цветного вывода в терминале.
  • Идеально для небольших утилит и прототипов.

3. log4rs — настраиваемый аналог log4j/log4net

log4rs (crate log4rs) — мощный фреймворк, вдохновлённый Java log4j. Позволяет конфигурировать логирование через YAML/JSON/TOML файлы или программно.

// Cargo.toml
// [dependencies]
// log = "0.4"
// log4rs = "1.2"

use log::info;

fn main() {
    // Программная конфигурация
    log4rs::init_file("log4rs.yaml", Default::default()).unwrap();
    info!("log4rs настроен через файл");
}

// log4rs.yaml
// refresh_rate: 30 seconds
// appenders:
//   stdout:
//     kind: console
//     encoder:
//       pattern: "{d(%Y-%m-%d %H:%M:%S)} {l} - {m}{n}"
//   file:
//     kind: file
//     path: "app.log"
//     encoder:
//       pattern: "{d} {l} {t} - {m}{n}"
// root:
//   level: info
//   appenders:
//     - stdout
//     - file

Особенности:

  • Поддержка нескольких аппендеров (вывод в файл, консоль, syslog, network).
  • Автоматическая ротация логов по размеру или времени.
  • Фильтрация по модулям, уровням, пользовательским фильтрам.
  • Рекомендуется для серверных приложений и микросервисов.

4. tracing — асинхронное и структурированное логирование

tracing (crate tracing) — современная альтернатива, разработанная Tokio team. Она поддерживает структурированные события, спаны (span) для отслеживания времени выполнения и асинхронные контексты.

// Cargo.toml
// [dependencies]
// tracing = "0.1"
// tracing-subscriber = "0.3"

use tracing::{info, span, Level};
use tracing_subscriber::fmt;

fn main() {
    // Инициализация subscriber
    fmt::init();

    let span = span!(Level::INFO, "main_span", user_id = 42);
    let _guard = span.enter();
    info!("Выполнение основной логики");
    // При выходе из спана автоматически замеряется время
}

// Вывод:
// 2025-03-15                    

Рекомендаций