#log #logging #loki #logging-framework #logfmt

log_loki

为与log crate一起使用提供loki日志功能。可以独立使用或与fern等日志框架一起使用。

1 个不稳定版本

0.1.1 2022年12月11日
0.1.0 2022年12月11日

#476 in 调试

MPL-2.0 许可证

34KB
709

log_loki

log_loki通过集成log crate,简化了将应用程序日志收集和发送到Loki实例的过程。

请注意,目前我并不认为这个crate已经准备好投入生产。我已经验证它“基本可以工作”,但我还没有编写完整的测试,也没有优化可能存在的任何低效之处。买者自慎!

安装

要将log_loki添加到您的项目中,请确保您的Cargo.toml中包含以下两行:

log = "^0.4.17"
log_loki = "^0.1.0"

特性

此crate支持以下特性:

  • tls - 使用rustls支持通过TLS与Loki通信。
  • tls-native-certs - 告诉底层的HTTP库ureq使用系统的证书存储,而不是webpki-roots存储,用于TLS。
  • compress - 使用GZIP(通过flate2 crate)压缩发送到Loki的日志。
  • kv_unstable - 启用对log crate结构化日志的实验性支持。
  • logfmt - 启用logfmt日志格式化器。

默认特性为tlstls-native-certslogfmtcompress。默认情况下,使用logfmt特性格式化日志。如果禁用该特性,您必须提供自己的LokiFormatter实现。

用法

要仅将日志记录到未认证的Loki实例,可以使用以下方法:

use log::{info, logger};
use log_loki::LokiBuilder;
use url::Url;
use std::collections::HashMap;

fn main() {
   let mut labels = HashMap::new();
   labels.insert("app", "myapp");

   LokiBuilder::new(
       Url::parse("https://loki.example.com/loki/api/v1/push").unwrap(),
       labels,
   ).build().apply().unwrap();

   info!("Hello, {}!", "world");

   // The logger must be flushed before the application quits to ensure logs are not lost.
   logger().flush();
}

通过LokiBuilder方法的.add_header()和.tls_config(),可以使用基于头部和mTLS的认证方案。

如果您还想将日志记录到其他位置(如日志文件、控制台等),可以使用Fern等日志框架将log_loki与其他日志实现结合使用

// Let loki be a Loki object
let colors = ColoredLevelConfig::default();

fern::Dispatch::new()
    .level(log::LevelFilter::Trace)
    .chain(Box::new(loki) as Box<dyn log::Log>)
    .chain(fern::Dispatch::new()
         .format(move |out, message, record| {
            out.finish(format_args!("[{}] {}", colors.color(record.level()), message))
         })
        .chain(std::io::stdout())
        .into_shared()
    )
    .apply().unwrap();

info!("Test!");

// call somewhere before the program ends
logger().flush();

刷新

为了提高效率,记录器内部缓冲日志消息,并在记录一定数量的消息或经过一定时间后等待。您可以使用分别的max_logs()max_log_lifetime() LokiBuilder方法调整消息数量或自动刷新之间的持续时间。还建议您在代码中安排所有退出路径调用logger().flush();以最小化丢失日志的风险。

许可证

/*
    Copyright (C) 2022 Aurora McGinnis

    This Source Code Form is subject to the terms of the Mozilla Public
    License, v. 2.0. If a copy of the MPL was not distributed with this
    file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/

依赖关系

~6–18MB
~340K SLoC