firewatcher
Watch a log stream (journald, syslog, or any file) for incident patterns, then persist a window of surrounding messages to a durable location — including a network filesystem — so the record survives even if the machine later dies.
The watcher prefers journalctl --follow when journalctl is on PATH. On hosts without journald it falls back to /var/log/syslog, then /var/log/messages, or --log-file. Running the daemon does not require systemd; only --install-service / --uninstall-service do.
Install
pip install firewatcher
From a clone of this repository:
pip install .
Requires Python 3.6+. No third-party runtime dependencies.
Quick start
firewatcher /etc/firewatcher/patterns.d
firewatcher -t 300 -o /var/log/captured_messages/ /etc/firewatcher/patterns.d
A directory argument loads every non-hidden pattern file inside it. Files ending in .regex are compiled as regular expressions. Any other pattern file is treated as fnmatch (bash-like) substrings, with * added on both ends.
--install-service seeds /etc/firewatcher/patterns.d with example patterns when that directory is empty. The examples/ directory in the source tree is not installed onto PATH by pip install; copy those files from a clone, or let --install-service write them.
On a match, firewatcher writes:
- a per-incident capture under
{output-folder}/{YYYY-MM}/… - a line in
{output-folder}/journal.log
Live capture is written as lines arrive, so a copy can already be on another filesystem if the host then disappears.
systemd service
sudo firewatcher --install-service
sudo firewatcher --print-unit
sudo firewatcher --uninstall-service
--install-service writes /etc/systemd/system/firewatcher.service, creates the output directory, seeds /etc/firewatcher/patterns.d/ with example patterns only if that directory is empty, then systemctl daemon-reload && systemctl enable --now firewatcher.
If systemd is not available, --install-service and --uninstall-service print a warning and exit. --print-unit still works so you can copy the unit elsewhere.
Useful flags:
| Flag | Description |
|---|---|
--unit-name NAME |
Unit name (default: firewatcher) |
--requires-mounts-for PATH |
Add RequiresMountsFor= (repeat for NFS/remote output) |
--no-enable |
Write the unit and reload, but do not enable or start it |
sudo firewatcher --install-service -o /mnt/logs/captured_messages \
--requires-mounts-for /mnt/logs/captured_messages \
/etc/firewatcher/patterns.d
Options
| Flag | Description |
|---|---|
pattern_file … |
Pattern files or directories |
--log-file |
Log file to follow (default: journalctl / syslog / messages) |
-t, --capture-time |
Seconds of context after a match (default: 300) |
-o, --output-folder |
Where to write captures (default: /var/log/captured_messages/) |
--tail_lines |
Lines to start with (default: 20; +N from line N, not with journalctl) |
--filter_only |
Filter existing logs only (cat instead of tail -F, or journalctl without --follow) |
--compress-after-months |
Tar.xz monthly dirs after N months (default: 3) |
--delete-after-months |
Delete YYYY-MM dirs after N months (default: 0 = never) |
--capture_line_count_max |
Max lines before/after a match (default: 10000) |
--install-service |
Install and enable a systemd unit |
--print-unit |
Print that unit and exit |
--uninstall-service |
Disable and remove the unit |
-V, --version |
Show version and exit |
Author
Yufei Pan (pan@zopyr.us)
License
GPL-3.0-or-later
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file firewatcher-1.57.tar.gz.
File metadata
- Download URL: firewatcher-1.57.tar.gz
- Upload date:
- Size: 16.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.12.9 {"installer":{"name":"uv","version":"0.12.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
eeaf29d271086e00e7e37ada7c1c54120f9dc679e0f064d0bee0f391b1aa2555
|
|
| MD5 |
24dd910ef22f8adafd02307cefc8b6f8
|
|
| BLAKE2b-256 |
59d9cbf3ffee555342859c4fe61890e432b2d87974357476682cd6a15d5c2db1
|
File details
Details for the file firewatcher-1.57-py3-none-any.whl.
File metadata
- Download URL: firewatcher-1.57-py3-none-any.whl
- Upload date:
- Size: 10.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.12.9 {"installer":{"name":"uv","version":"0.12.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
244b945b8020186a654397b8120da8f2ba842b1d51e901b6d8348d2f0cff92d9
|
|
| MD5 |
71cc8b35e4c4c6506e9305147f847f61
|
|
| BLAKE2b-256 |
3ab327e3c2e413475bf0fa684c0b275a78386e77695b6c7313ddac5719c9ccc5
|