1个不稳定版本

0.1.0 2021年1月1日

#641 in Unix APIs


tracing-systemd中使用

AGPL-3.0-or-later

94KB
833 lines

sdJournal

sd-journal是libsystemd中systemd API的sd-journal包装器。sd-journal是systemd.rs项目的一部分。

gitlab.com crates.io docs.rs
sd-sys Crates.io docs.rs
sd-id128 Crates.io docs.rs
sd-journal Crates.io docs.rs

systemd.rs是systemd-rust项目的替代品。

  • systemd.rs在AGPL-3.0许可证下发布。如需个人/商业许可证,请提出请求。
  • 仅关注sd-id128 & sd-journal的覆盖范围(目前没有计划扩展此覆盖范围)
  • 良好的文档,包含对libsystemd文档的链接
  • 在关注区域内100%覆盖libsystemd
  • 良好的测试覆盖率
  • 注重可用性

结构

libsystemd是用C语言开发的,围绕一个名为"journal"的单个结构体,没有区分函数是引用整个journal还是引用journal中的单个记录。
此库还为主结构体Journal提供了所有包装函数。此外,还为Journal实现了两个迭代器:CursorIteratorCursorReverseIterator,它们都返回一个Result<Cursor, Error>。Cursor上实现的所有方法都会调用Journal上实现的方法。因此,Cursor的文档总是引用Journal的文档。
libsystemd实现了某些额外的枚举。对于这些中的每一个,都实现了相应的迭代器。

状态 & 稳定性

此库仍在开发中。有一些方法被标记为具有“实验性”功能。这些方法尚未最终确定。每个方法的文档中都包含更多信息。此外,库结构目前正在调查中。目前,所有方法都是为结构体Journal实现的。这可能会很快改变:引用单个记录的方法可能被移动到结构体Cursor中,而执行光标移动(next()、previous()等)的方法将返回Cursor。

计划开发

  • 进一步rust化
    • 从Journal中删除Cursor方法
    • CursorMovement返回Cursor而不是仅仅返回Done
  • 附加特性实现
  • 日志记录器实现
  • 编码支持

编码

Journald以"字段名=字段值"的形式存储数据。虽然字段名是严格UTF-8编码的,字段值通常也是UTF-8编码的,但字段值也可以是任何编码,包括二进制数据。这个库允许以任何编码记录到日志中,尽管强烈建议只使用UTF-8。在从日志读取时,这个库将严格地遇到非UTF-8数据时引发错误。在未来版本中可能会添加解码支持以及有损解码。

示例

cargo.toml

[dependencies]
sdJournal = "0.1"

日志记录

use sd_journal::*;
Journal::log_message(Level::Info, "Hello World!").unwrap();
Journal::log_raw_record(&["MESSAGE=Hello World!",
                          &format!("PRIORITY={}", Level::Info),
                          &format!("CODE_FILE={}", file!()),
                          &format!("CODE_LINE={}", line!()),
                          "CUSTOM_FIELD=42"]).unwrap();

读取访问

use sd_journal::*;
use std::path::PathBuf;

// load local test data
let mut test_data = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
test_data.push("test-data/");
println!("looking for test data in folder {}", test_data.display());
let journal = Journal::open_directory(&test_data, PathFlags::FullPath, UserFlags::AllUsers).unwrap();

// loop over journal records
while let Ok(CursorMovement::Done) = journal.next() {
    // do something on each cursor, e.g. print the MESSAGE
    println!("{}", journal.get_data("MESSAGE").unwrap());
}

许可证

sd-journal: libsystemd的sd-journal包装器

版权(C)2020 克里斯蒂安·克莱乌 [[email protected]]

本程序是自由软件:您可以按照自由软件基金会发布的GNU Affero通用公共许可证的条款重新分发和/或修改它,许可证版本为3,或者(根据您的选择)许可证的任何后续版本。

本程序的分发是希望它会有用,但没有提供任何保证;甚至没有隐含的适销性或适用于特定目的的保证。有关详细信息,请参阅GNU Affero通用公共许可证。

您应该已收到GNU Affero通用公共许可证的副本。如果没有,请参阅https://gnu.ac.cn/licenses/

可以根据要求授予个别许可证。

依赖关系

~62–390KB