qjournal 0.1.0

Cross-platform native systemd-journald compatible journal reader/writer
Documentation

qjournal

Cross-platform, native Rust implementation of the systemd-journald binary journal format.

Read and write .journal files fully compatible with journalctl --file=<path>, without depending on libsystemd.

Features

  • Write journal entries with arbitrary fields
  • Read entries back, iterate, or query by field value
  • Zstd compression support (enabled by default)
  • Compatible with keyed-hash and compact journal formats
  • No C dependencies — pure Rust with safe memory-mapped I/O

Usage

Add to your Cargo.toml:

[dependencies]
qjournal = "0.1"

Writing

use qjournal::JournalWriter;
use std::path::Path;

let mut writer = JournalWriter::open(Path::new("/tmp/test.journal"))?;
writer.append_entry(&[
    ("MESSAGE", b"Hello, world!" as &[u8]),
    ("PRIORITY", b"6"),
    ("SYSLOG_IDENTIFIER", b"myapp"),
])?;
writer.flush()?;

Reading

use qjournal::JournalReader;
use std::path::Path;

let reader = JournalReader::open(Path::new("/tmp/test.journal"))?;
for entry in reader.entries() {
    let entry = entry?;
    if let Some(msg) = entry.get(b"MESSAGE") {
        println!("{}", String::from_utf8_lossy(msg));
    }
}

Querying by field

let errors = reader.entries_for_field("PRIORITY", b"3")?;
for e in &errors {
    println!("{:?}", e.message());
}

Verify output with systemd tooling:

journalctl --file=/tmp/test.journal

Feature flags

Flag Default Description
zstd-compression yes Enable zstd compression

License

Licensed under the GNU Lesser General Public License v2.1 or later.

SPDX-License-Identifier: LGPL-2.1-or-later