#syslog #dmesg #linux-kernel #klogctl #printk

bin+lib rmesg

这是一个基于Rust的流行Linux实用程序dmesg的完整实现,提供对内核日志缓冲区的程序访问

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 操作系统

Download history 2990/week @ 2024-04-22 2232/week @ 2024-04-29 934/week @ 2024-05-06 2038/week @ 2024-05-13 1339/week @ 2024-05-20 2002/week @ 2024-05-27 2471/week @ 2024-06-03 2055/week @ 2024-06-10 1500/week @ 2024-06-17 595/week @ 2024-06-24 1432/week @ 2024-07-01 1321/week @ 2024-07-08 823/week @ 2024-07-15 1930/week @ 2024-07-22 2749/week @ 2024-07-29 2369/week @ 2024-08-05

每月下载量7,879

Apache-2.0

67KB
1.5K SLoC

Build Status

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 API
  • sync - 提供同步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