Skip to main content

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

firewatcher-1.57.tar.gz (16.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

firewatcher-1.57-py3-none-any.whl (10.8 kB view details)

Uploaded Python 3

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

Hashes for firewatcher-1.57.tar.gz
Algorithm Hash digest
SHA256 eeaf29d271086e00e7e37ada7c1c54120f9dc679e0f064d0bee0f391b1aa2555
MD5 24dd910ef22f8adafd02307cefc8b6f8
BLAKE2b-256 59d9cbf3ffee555342859c4fe61890e432b2d87974357476682cd6a15d5c2db1

See more details on using hashes here.

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

Hashes for firewatcher-1.57-py3-none-any.whl
Algorithm Hash digest
SHA256 244b945b8020186a654397b8120da8f2ba842b1d51e901b6d8348d2f0cff92d9
MD5 71cc8b35e4c4c6506e9305147f847f61
BLAKE2b-256 3ab327e3c2e413475bf0fa684c0b275a78386e77695b6c7313ddac5719c9ccc5

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

1.57 This release

2 files

1.56

2 files

1.55

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page