#log-messages #logging #redis #log #logger #pubsub #redis-server

redis_logger

实现log::Log trait的日志记录器,使用redis_rs crate将日志消息写入Redis pub/sub通道、流或两者

5个版本

0.3.2 2024年2月21日
0.3.1 2024年2月21日
0.3.0 2024年2月19日
0.2.1 2024年2月16日
0.2.0 2024年2月16日

#605 in 调试

MIT/Apache

35KB
495

redis_logger

Crates.io Docs MIT/APACHE-2.0

log::Log 实现允许将日志记录到Redis服务器。它支持将日志写入任意数量的pub/sub通道或流或两者。

您可以为pub/sub和流日志消息指定自定义编码器。使用 default_encoders 功能,编码器的默认实现可用。此功能默认禁用。

如果您启用 shared_logger 功能,您可以在 simplelog::CombinedLogger 中使用 RedisLogger

用法

将依赖项添加到您的 Cargo.toml

[dependencies]
log = "0.4"
redis = "0.24"
redis_logger = "0.3"

如何在您的应用程序中使用它

使用 RedisLoggerConfigBuilder 方法构建一个 RedisLoggerConfig。指定一个连接和至少一个pub/sub或流通道。使用此配置实例化一个 RedisLogger 实例,如果您希望使用此日志记录器与其他日志记录器(如 parallel_logger crate 或 simplelog crate 中的 CombinedLogger 日志记录器)一起使用,或者使用 RedisLogger::init 方法将日志记录器初始化为应用程序的唯一日志记录器。

使用 default_encoders 功能并将 RedisLogger 设置为唯一日志记录器的简单示例如下

fn main() {
    let redis_client = redis::Client::open(REDIS_URL).unwrap();
    let redis_connection = redis_client.get_connection().unwrap();

    RedisLogger::init(
        LevelFilter::Debug,
        RedisLoggerConfigBuilder::build_with_pubsub_default(
            redis_connection,
            vec!["logging".into()],
        ),
    );
}

此更广泛的示例在 ParallelLogger 中使用 RedisLogger 并使用 bincode crate 和自定义 PubSubEncoder 对pub/sub消息进行编码

struct BincodeRedisEncoder;

impl PubSubEncoder for BincodeRedisEncoder {
    fn encode(&self, record: &log::Record) -> Vec<u8> {
        let mut slice = [0u8; 2000];
        let message = SerializableLogRecord::from(record);
        let size = bincode::encode_into_slice(message, &mut slice, BINCODE_CONFIG).unwrap();
        let slice = &slice[..size];
        slice.to_vec()
    }
}
 
fn main() {
    let redis_client = redis::Client::open(REDIS_URL).unwrap();
    let redis_connection = redis_client.get_connection().unwrap();

    ParallelLogger::init(
        log::LevelFilter::Debug,
        ParallelMode::Sequential,
        vec![
            FileLogger::new(LevelFilter::Debug, "log_file.log"),
            TerminalLogger::new(LevelFilter::Info),
            RedisLogger::new(
                LevelFilter::Debug,
                RedisLoggerConfigBuilder::build_with_pubsub(
                    redis_connection,
                    vec!["logging".into()],
                    BincodeRedisEncoder {},
                ),
            ),
        ],
    );
}

路线图

  • 支持除redis_rs以外的其他Redis crate(如fred)。
  • 支持在调用Redis时使用原子管道。

许可

许可协议为以下之一

依赖

约3-10MB
约127K SLoC