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

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

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

Начать курс

Логирование для Rust: лучшие решения

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

1. Крейт log — абстракция над логированием

Библиотека log является фундаментом всей системы логирования в Rust. Она предоставляет фасад (facade) — набор трейтов и макросов, которые не зависят от конкретного бэкенда. Вы пишете код один раз, а вывод логов настраиваете через внешний логгер.

Основные макросы:

  • error! — критические ошибки
  • warn! — предупреждения
  • info! — информационные сообщения
  • debug! — отладочная информация
  • trace! — детальная трассировка

Пример использования:

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

fn main() {
    // Перед использованием нужно инициализировать логгер
    // env_logger::init(); // или другой бэкенд
    
    info!("Приложение запущено");
    warn!("Диск заполнен на 90%");
    error!("Ошибка подключения к БД: {:?}", err);
}

2. env_logger — простота и гибкость

Самый популярный бэкенд для log. Настройка происходит через переменную окружения RUST_LOG. Это идеальный выбор для небольших проектов и утилит.

Установка:

[dependencies]
log = "0.4"
env_logger = "0.11"

Пример с фильтрацией по модулям:

use log::info;

fn main() {
    env_logger::init();
    
    // Запустите: RUST_LOG=my_crate=info cargo run
    info!("Это сообщение появится только для my_crate");
    
    // RUST_LOG=warn — покажет только warn и error
    // RUST_LOG=debug — покажет всё, включая debug
}

Переменная RUST_LOG поддерживает сложные фильтры:

  • RUST_LOG=info — уровень info и выше
  • RUST_LOG=my_crate=debug,other_crate=warn — разные уровни для разных крейтов
  • RUST_LOG=off — отключить логирование

3. log4rs — конфигурация через YAML

Если вам нужен продвинутый контроль — несколько аппендеров (файл, консоль, syslog), ротация логов, форматирование — выбирайте log4rs. Он вдохновлён Java Log4j.

Пример конфигурации 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} {M} - {m}{n}"

root:
  level: info
  appenders:
    - stdout

loggers:
  app::db:
    level: debug
    appenders:
      - file
    additive: false

Инициализация в коде:

use log4rs;

fn main() {
    log4rs::init_file("log4rs.yaml", Default::default()).unwrap();
    
    log::info!("Логирование настроено через YAML");
    log::debug!("Это сообщение уйдёт только в файл");
}

Ключевые возможности log4rs:

  • Ротация логов по размеру или времени
  • Разные аппендеры для разных модулей
  • Автоматическая перезагрузка конфигурации
  • Поддержка JSON-формата

4. tracing — современный подход

Библиотека tracing от команды Tokio — это не просто логирование, а целая система для диагностики приложений. Она поддерживает структурированные события и спаны (span), что особенно полезно в асинхронных приложениях.

Пример со спанами:

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

fn process_request(id: u64) {
    let span = span!(Level::INFO, "request", id);
    let _guard = span.enter();
    
    info!("На                    

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