Логирование для 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!("На