#log #logger #sqlite #logging

已撤回 ice-age

适用于服务器程序的简单日志工具包

14个重大版本发布

0.16.0 2020年5月3日
0.15.0 2020年1月10日
0.14.0 2019年9月17日
0.13.0 2019年6月12日
0.3.0 2018年9月23日

#308#logger

32 每月下载量

自定义许可

20KB
298 代码行

简单日志工具包

项目


设计

它使用同步通道进行通信。日志记录存储在RAM中,并将在某些可配置条件下刷新到磁盘:一定时间后或当记录数达到最大值时。

后端:SQLite。

该包的日志消息前面加上TAG

示例

use std::{
    env,
    sync::mpsc::TrySendError,
    thread,
    time::{UNIX_EPOCH, Duration, SystemTime},
};
use ice_age::{Config, Cmd, Log, Logger};

let config = Config {
    // Directory to save log files
    work_dir: env::temp_dir(),
    // For this example, max file length is 1 MiB
    max_file_len: 1024 * 1024,
    // Keep log files at most 3 days
    log_files_reserved: Duration::from_secs(3 * 24 * 60 * 60),
    // Maximum log records to be kept in RAM
    buf_len: 5_000,
    // Flush to disk every 30 minutes
    disk_flush_interval: Duration::from_secs(30 * 60),
};

let logger = Logger::make(config).unwrap();
for _ in 0..3 {
    let logger = logger.clone();
    thread::spawn(move || {
        let log = Log {
            time: SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs(),
            remote_ip: String::from("127.0.0.1"),
            url: String::from("/api/statistics"),
            response_size: Some(512),
            code: 200,
            runtime: Duration::from_secs(1),
            notes: None,
        };

        // Use ::try_send() to not block the thread.
        // This example's strategy is to discard failed calls.
        match logger.try_send(Cmd::StoreLog(log)) {
            Ok(()) => (),
            Err(TrySendError::Full(_)) =>
                eprintln!("Log buffer is full, discarding..."),
            Err(TrySendError::Disconnected(_)) =>
                eprintln!("Failed to store log. Perhaps log server is down."),
        };
    });
}

依赖

~22MB
~419K SLoC