28个版本 (稳定)
1.0.21 | 2023年9月25日 |
---|---|
1.0.20 | 2022年4月29日 |
1.0.19 | 2022年3月3日 |
1.0.18 | 2021年12月23日 |
0.5.0 | 2020年4月30日 |
#87 in 操作系统
每月下载量7,879
67KB
1.5K SLoC
rmesg
Rust中的'dmesg'实现
作为一个crate: https://crates.io/crates/rmesg
作为一个命令行实用工具
获取最新版本二进制文件
wget https://github.com/archisgore/rmesg/releases/latest/download/rmesg
chmod a+x ./rmesg
# Optionally move to a stable location
mv ./rmesg /usr/local/bin
Cargo安装
cargo install rmesg
用法
rmesg: A 'dmesg' port onto Rust 1.0.0
Archis Gore <me@archisgore.com>
Reads (and prints) the kernel log buffer. Does not support all dmesg options (yet).
USAGE:
rmesg [FLAGS] [OPTIONS]
FLAGS:
-c Clear ring buffer after printing (only when using klogctl)
-f When specified, follows logs (like tail -f)
-h, --help Prints help information
-r Print raw data as it came from the source backend.
-V, --version Prints version information
OPTIONS:
-b <backend> Select backend from where to read the logs. klog is the syslog/klogctl system call through libc.
kmsg is the /dev/kmsg file. [possible values: klogctl, devkmsg]
作为一个crate
这个crate的真实价值在于从Rust程序中对内核缓冲区进行程序访问,允许进行程序化的dmesg
。
完整的API可以在使用sync/async版本的API的main.rs
文件中找到,包括单次和迭代。
依赖于rmesg crate
在Cargo.toml中包含它
[dependencies]
rmesg = "1.0.0"
支持两个特性
async
- 提供异步Stream APIsync
- 提供同步Iterator API
单次读取缓冲区(非阻塞)
注意:单次读取是sync或async的相同接口
use rmesg;
// Read all logs as one big string with line-breaks
let raw = rmesg::logs_raw(opts.backend, opts.clear).unwrap();
print!("{}", raw)
// Read logs as a Vec of Entry'ies (`Vec<Entry>`)
// and can be processed entry-by-entry
let entries = rmesg::log_entries(opts.backend, opts.clear).unwrap();
for entry in entries {
println!("{}", entry)
}
无限迭代
使用特性sync
(即同步),提供一个Result<Entry, RMesgError>的Iterator。
use rmesg;
let entries = rmesg::logs_iter(opts.backend, opts.clear, opts.raw)?;
for maybe_entry in entries {
let entry = maybe_entry?;
println!("{}", entry);
}
使用特性async
(即异步),提供一个Result<Entry, RMesgError>的Stream。
use rmesg;
// given that it's a stream over Result's, use the conveniences provided to us
use futures_util::stream::TryStreamExt;
let mut entries = rmesg::logs_stream(opts.backend, opts.clear, opts.raw).await?;
while let Some(entry) = entries.try_next().await? {
println!("{}", entry);
}
依赖关系
~5–8.5MB
~149K SLoC