Skip to content

About

Lightweight cross-platform desktop syslog viewer and analyzer. UDP/TCP/TLS, real-time filtering, FTS5 search, alerts, PKI assistant, at-rest encryption. Built with Go + Svelte (Wails).

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

12 stars

Watchers

0 watching

Forks

Latest commit

 

History

269 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

SyslogStudio

SyslogStudio

A syslog server, log viewer and alert router in one native binary.
Built with Wails — Go and Svelte.

Website · Try it in your browser · Download · Documentation

CI Release Downloads License Platform Go Svelte

Point your switches, firewalls and servers at it and read what they say. Receive over UDP, TCP or TLS, search months of history in a local database, raise alerts on the lines that matter, and relay those lines on to another collector, a webhook or your inbox. No agent, no account, no service to stand up.

Try it without installing anything. The browser demo is the real application running on sample data, with the Go backend replaced by fixtures. Every screenshot below comes from that same bundle, so none of them can show an interface the product does not actually produce.


Screenshots

Live log viewer

Messages as they arrive, with severity badges, sortable columns, filtering and group-by.

The log viewer: severity badges, timestamp, protocol, source, host, application and message, with a filter bar above.

Routing and notifications

Rules decide which messages are interesting; destinations decide where they go — another syslog collector, a webhook, or e-mail.

The routing tab: three destinations and the rules that feed them, with a delivery log underneath.

Statistics

Total messages, messages per second, buffer use, a breakdown by severity and the top sources.

Alerts

Alert rules with their patterns and severity thresholds, and the events they caught.

Importing a log file

A log file already on disk, sorted by severity. What was read and what was guessed are counted separately, before anything is imported.

The import dialog: how many lines carried a syslog priority, how many were plain text, what was inferred from them, the count per severity, and a sample of the result.

Detection reads a timestamp at the front of the line and a severity word standing on its own, which covers most files. When it does not — JSON lines, an access log, a stack trace — the format can be declared, and the sample is re-read on every change.

The format panel: a mode to read the file as, a pattern with named groups, a time layout, the year and timezone, and switches for joining continuation lines and skipping lines that do not match.

Anonymous mode

Hostnames, addresses and user names replaced by stable stand-ins, so a screenshot can go in a ticket without going through a redaction tool first.

The same log viewer with anonymous mode on: identifying values replaced by stable stand-ins.

Running with no window

In your session, started at sign-in and hidden in the tray — or as a Windows service that starts with the computer, before anyone signs in, and that the window then drives.

Settings, Background tab: the user-session options above, and below them the system service, running and listening on UDP 514, TCP 601 and TLS 6514, with three sealed batches waiting for the window to collect them. A banner says the window drives the service.

Built-in traffic generator

The simulator tab: destinations with host and port, a mode, a profile and a rate.

Features

Receiving

  • UDP, TCP and TLS listeners, any port, bound to one interface or all of them
  • RFC 5424 with an RFC 3164 fallback, on every transport — the switch that has not been updated since 2009 still parses
  • What bends the RFCs is read too: rsyslog's forwarding format, JSON, key=value (FortiGate), Cisco IOS and ASA, messages with no priority — with the same readers a file import uses
  • Source rules for the devices that bend it further: right-click a message, say how that device is read (any import format, a regex), fix its hostname, application, clock, severity or encoding, and watch its latest messages change before saving — then read the stored history again with it. Start from a template, save your own, and export them to share. Settings > Devices lists every sender, and marks those that could use a rule; on the local network, with its MAC address and maker, and the devices whose address changed — and a rule can name a device by its MAC, which follows it through DHCP (local network only)
  • Mutual TLS where senders must prove who they are
  • Allowed sources by IP literal or CIDR (hygiene, not authentication — see the note below)
  • Per-IP connection cap so one host cannot occupy every slot

Reading

  • Live view — an in-memory ring buffer of the last 10 000 messages, updating as they arrive
  • History — server-side paginated queries over the database, as far back as your retention
  • Three search modes — words, full-text with AND/OR/NOT/NEAR, and Go regular expressions, finding the same messages in the live view and in the history
  • Filter, sort and group by severity, facility, host, application, source IP or time range
  • Explicit timezones — follow the machine, pin to UTC, or name a zone; the column header says which one it is showing
  • Right-click a line to copy it (message, raw line, JSON, or the cell you aimed at), to narrow the view to that host, application, severity or the five minutes around it, or to turn it into an alert rule. In anonymous mode copying yields what is on screen, and the real value is a separate entry — you cannot paste a real address believing it was masked
  • Columns you arrange — drag an edge to resize, double-click it to fit the widest value, drag a heading to move the column, and right-click any heading to add or remove one: facility, process id, message id, RFC version and received time are all there, hidden until wanted. Widths, order and choice are remembered
  • Keyboard navigation — arrows, Page Up/Down, Home/End walk the list, Escape closes the detail, / jumps to the search box. Shift+arrows extend a selection
  • Pick several lines — click, Ctrl-click, Shift-click, then copy them or export exactly those. In anonymous mode you copy what is on screen, not what is behind it
  • Freeze the stream while you read it — nothing is dropped, and the list says how many arrived and catches up when you release it
  • Saved filters — name the set of criteria you keep retyping and recall it in one click
  • Drop a log file on the window to import it, with the same preview as the file picker
  • A detail panel you can widen — drag the edge between the list and the message, double-click it to go back to the default
  • Export as CSV, plain text, NDJSON, syslog (RFC 5424 or RFC 3164, replayable into any collector — including this one) or a self-contained HTML report for someone who does not have the application. In anonymous mode the export follows the screen by default, and says so
  • Import a log file already on disk — .log, .txt or a rotated .gz. A captured syslog file is parsed exactly as it would be off the wire; a plain application log has its timestamp and level read out of the text, and a preview says how much was read and how much was inferred before anything is imported. An import never fires alert rules and is never relayed onward
  • Describe the file when guessing is not enough — JSON lines, an access log, logfmt, or a regular expression with named groups, plus the year and timezone a file leaves unsaid. Continuation lines fold into the record above them, so a stack trace is one message at the right severity instead of twenty. Every change re-reads the same sampled lines, and the format that worked is remembered for the next import

Keeping

  • SQLite persistence with retention by age, count and size — continuously or on a daily, weekly or monthly schedule — disk space given back as it goes, and a forecast of where the database is heading
  • At-rest encryption — AES-256-GCM with Argon2id key derivation, the password held in memory only
  • Brute-force protection that survives a restart, so a stolen laptop cannot be brute-forced by relaunching the application

Noticing

  • Alert rules on a substring or regular expression, a severity floor, a host or an application, with a cooldown so one flapping port is not four hundred notifications
  • Desktop notifications and an alert history

Forwarding

  • Rule-based routing of every received message, not only the ones that trip an alert — which is what makes relaying a whole stream possible
  • Three destination kinds — syslog (UDP/TCP/TLS, keeping the origin hostname), webhook (JSON envelope or your own template), and e-mail (STARTTLS, implicit TLS or none; authenticated or anonymous)
  • Mutual TLS for syslog and e-mail destinations, each with its own trust anchor
  • Write-only credentials bound to their destination — moving a webhook to another host drops the stored token rather than following it there
  • Loop detection — a destination aimed at this application's own listener is refused, and a message already relayed is not relayed again
  • Rate breaker — a destination flooded with repeating content is cut off, disabled and reported, rather than quietly filling a disk

Running unattended

  • In your session — start at sign-in, hidden in the tray, and start receiving on launch with the saved listeners. No administrator needed
  • As a system service, on Windows or on Linux with systemd — installed from Settings > Background with one administrator prompt; starts at boot under its own account (NT SERVICE\SyslogStudio, or a syslogstudio system user on Linux) with its own configuration and database, credentials and private key protected by DPAPI, a firewall rule for domain and private networks, and automatic restart after a failure. An encrypted database stays encrypted: the service seals what it receives for your window to collect
  • Headless — SyslogStudio --headless runs the engine with no window, for systemd, launchd or a terminal

The rest

  • Built-in traffic generator to prove the chain works before a device is pointed at it
  • Anonymous mode masking hosts, addresses, MACs, e-mails and user names with stable stand-ins from the documentation ranges (RFC 5737, RFC 3849)
  • TLS/PKI assistant — generate a CA and server certificates from the interface; both are kept across restarts, so clients meet the certificate they were told to trust. A certificate given as files is re-read when it is renewed on disk, without a restart
  • Light and dark themes, persisted
  • Eight languages — English, French, German, Spanish, Portuguese, Italian, Japanese, Chinese
  • Signed releases with SLSA build provenance and an in-application updater that verifies it before replacing anything

Search syntax

Mode Button Syntax Example
Text Aa these words in this order, the last one possibly unfinished connection ref
FTS FTS words with AND, OR, NOT, NEAR error OR fail OR timeout
Regex .* Go regular expressions (error|fail)\s+.*timeout

FTS accepts:

  • error fail (both);
  • error OR fail (either);
  • error NOT debug (the first without the second);
  • (error OR fail) NOT debug (grouping);
  • "connection refused" (phrase);
  • err* (prefix);
  • NEAR(error timeout, 5) (at most 5 words apart).

Operators work in any case. A search is compiled once, in Go, and the live view, the history and exports all apply that same compiled search, so they find the same messages. A search that does not compile is not applied, and the window says why.


Install

Download a build from the releases page or the download page. One executable, no runtime to install.

Platform Files
Windows NSIS installer, or portable .zip
macOS universal .dmg or .zip (Apple Silicon and Intel)
Linux .deb, or portable .tar.gz — needs GTK 3 and WebKit2GTK

The Windows installer asks whether to install just for you (in your profile, no administrator rights) or for all users (in Program Files, with administrator rights). Either can keep receiving in the background during your session; only an all-users install can also run as a Windows service, receiving from boot with nobody signed in (see Running with no window under Usage). Over an existing installation — which is what the in-app update does — the installer preselects that copy's mode and updates it where it is. Choosing all users over a per-user copy replaces it with one in Program Files, keeping your settings and logs.

Verify what you downloaded:

gh attestation verify SyslogStudio-windows-amd64.zip --repo Wasabules/SyslogStudio

Default ports

Protocol Default Standard
UDP 1514 514
TCP 1514 514 or 601
TLS 6514 6514

The defaults are deliberately above 1024 so the first run binds without elevation on Linux and macOS. To use 514 there, either run with privilege or grant the binary the one capability it needs:

sudo setcap 'cap_net_bind_service=+ep' /usr/bin/syslogstudio

Usage

  1. Choose the transports in the bar across the top, set their ports, and press Start
  2. Point a device at it — logger -n <host> -P 1514 -d "hello" is the quickest test
  3. Read — Live for what is arriving, History for what is stored; filter, sort, group, and click a row for every parsed field and the raw frame
  4. Alerts — write rules for the lines you must not miss, with a cooldown
  5. Routing — add a destination, then a rule that feeds it
  6. Settings — retention, encryption, timezone, theme, language

The documentation walks through each of these, and everything except receiving can be tried in the demo.

On UDP and trust. A UDP source address is trivially forged. The allowed-sources list keeps a misconfigured host out of your database; it is not authentication. Where senders must genuinely be authenticated, use TLS with client certificates.

Running with no window

SyslogStudio keeps receiving without its window in two ways, set up in Settings > Background. They are for different situations, so they are kept apart.

In your session. Start SyslogStudio when I sign in registers the application with the system's own per-user mechanism (the Run key on Windows, a LaunchAgent on macOS, an XDG autostart entry on Linux); it starts hidden in the tray. Start receiving when SyslogStudio opens starts the listeners as last saved. With an encrypted database the window appears at sign-in to ask for the password, then goes back to the tray — nothing is stored until it is typed, and the application will not pretend otherwise. This mode runs under your account and stops when you sign out.

As a system service (Windows, Linux). For a machine that must receive with nobody signed in. Install the service asks for administrator rights once, then:

  • creates the SyslogStudio service, started automatically at boot under the virtual account NT SERVICE\SyslogStudio, restarted after a failure;
  • copies your listeners, alert rules, routes and destinations (credentials included) and your TLS certificate into %ProgramData%\SyslogStudio, readable by the service and administrators only — credentials and the private key additionally sealed with DPAPI;
  • adds an inbound firewall rule for the executable on domain and private networks;
  • stops this window's own listeners, since the service takes the ports;
  • allows your account to drive the service.

While the service runs, the window drives it: the settings it shows and changes are the service's, the messages it shows are the ones the service receives and stores, and so are the alerts, routes, certificates and imports. It connects over a local named pipe that only administrators and the allowed accounts may open; another account gets an Allow my account button, which asks for administrator rights once. When the service stops, the window goes back to your own receiver, and a banner says so.

Start and Stop in the window start and stop the service's listeners, while the service keeps running. At its next start, the service listens again as last saved, unless Start receiving when the service starts is turned off. In that case it starts with the computer but waits for someone to press Start.

An encrypted database stays encrypted. By default, the service then keeps no database. It seals each batch of messages with a public key (HPKE, hybrid post-quantum ML-KEM-768 + X25519), and it cannot read back what it stored.

Only your window can open those batches, once its database is unlocked. It moves the messages into your encrypted history, and the service deletes them. Up to 1 GB waits on the service in the meantime, with a warning as the inbox fills.

You can instead let the service store in the clear, in a database readable by administrators only. The installation asks you to confirm that choice.

SyslogStudio must be installed for all users (in Program Files) to install the service: a service runs under a system account, and a copy an ordinary user can replace would hand that account to whoever replaces it.

To check on it or find out why it does not start:

SyslogStudio.exe service status     state, listeners, whether they start with it, sealed inbox,
                                    messages received, connected windows, allowed accounts,
                                    last error
SyslogStudio.exe service allow --operator SID
                                    let another account drive it (as an administrator)

Its errors also go to the Windows Application event log (source SyslogStudio), and its own log is %ProgramData%\SyslogStudio\logs\service.log. service start, stop, uninstall [--purge] do what they say, from an administrator prompt. Updating SyslogStudio with the installer stops the service for the update and starts it again. A copy of the application still running, in the tray or in another user's session, has to be quit first: the installer and the uninstaller wait and say so.

On Linux with systemd, the same button installs a hardened systemd unit:

  • It runs SyslogStudio as a syslogstudio system user, allowed to listen on ports below 1024 and little else.
  • Its data are in /var/lib/syslogstudio, readable by root only.
  • It is reached over a Unix socket that only root and the allowed accounts may use.
  • It logs to the journal: journalctl -u syslogstudio.

Administrator rights come from polkit (pkexec). From a terminal, sudo syslogstudio service … does the same.

The service needs the copy the package installed, which only root can change. Removing the package removes the service and keeps its data. Upgrading it restarts the service on the new version.

Headless, anywhere. SyslogStudio --headless [--data-dir DIR] runs the engine in the foreground with no window until interrupted — under systemd or launchd, or in a terminal. By default it uses the application's own configuration directory, so you can set it up in the window first; it refuses an encrypted configuration, and refuses to share a directory with a running window. On Linux the binary is linked against GTK and WebKitGTK even when it opens no window, so a server needs those libraries installed — the .deb pulls them in. A minimal systemd unit:

[Service]
ExecStart=/opt/SyslogStudio/SyslogStudio --headless --data-dir /var/lib/syslogstudio
User=syslogstudio
AmbientCapabilities=CAP_NET_BIND_SERVICE
Restart=on-failure

Where things are kept

Platform Directory
Windows %APPDATA%\SyslogStudio\
macOS ~/Library/Application Support/SyslogStudio/
Linux ~/.config/SyslogStudio/
Windows service %ProgramData%\SyslogStudio\
Linux service /var/lib/syslogstudio/

config.json holds settings, rules and destinations; logs.db the messages; sinksecrets.json the destination credentials; ca.json and server-cert.json the generated CA and the server's TLS identity, private keys included. The last three are encrypted (.enc) when at-rest encryption is on. No credential is ever written to config.json.

Storage and encryption

Setting Options Default
Retention 1, 7, 30, 90, 180, 365 days, any number of days, unlimited 7 days
Keep whole days, weeks, months to the minute
Clean up continuously, every day, week or month at a set time continuously
Disk space given back as it goes, compacted after each scheduled cleanup, manual as it goes
Max messages 10K, 100K, 1M, 10M, unlimited 1M
Max size 100 MB, 500 MB, 1 GB, 5 GB, unlimited 500 MB

Roughly 400–600 bytes per message, index included; the Storage tab measures it on your own history and forecasts the database's size and the free disk space at the rate messages arrive.

Max size counts what the messages and their search index take, and like the message limit it applies at all times, whatever the schedule. Cleanups and compactions keep messages arriving: deletes run in small transactions, the space goes back to the disk a step at a time, and anything that rewrites the whole database holds incoming messages in memory meanwhile.

At-rest encryption uses AES-256-GCM with Argon2id (64 MB, 3 iterations, 4 threads). The password exists only in memory while the application runs.

If you forget it, the database is gone. There is no recovery mechanism, by design.


Building it

Prerequisites

go install github.com/wailsapp/wails/v2/cmd/wails@latest
cd frontend && npm install && cd ..

Development

wails dev

The application opens in a native window. A dev server is also available at http://localhost:34115, which serves the same interface in a browser with the Go methods bridged — handy for anything that is easier to inspect with devtools.

Build

wails build
wails build -ldflags "-X main.AppVersion=v1.4.0"   # with a version, for the updater

Tests

go test -race ./...
cd frontend && npx svelte-check --tsconfig ./tsconfig.json --fail-on-warnings

The site and the demo

The project site lives in docs/ and is published by GitHub Pages. The demo and the screenshots are built from the real application with fixtures instead of a backend, which is what stops the site showing something the product does not do.

node tools/demo.mjs          # build docs/demo/
node tools/screenshots.mjs   # photograph the application into docs/assets/img/
node tools/webp.mjs          # derive the responsive images the site serves
node tools/serve-site.mjs    # read docs/ the way Pages serves it
node tools/check-links.mjs   # what the Pages workflow checks before deploying

Generating traffic

The application has a generator built in, on the Simulator tab. There is also a standalone Python one with no dependencies:

python tools/syslog_generator.py --rate 10
python tools/syslog_generator.py --mode scenario
python tools/syslog_generator.py --mode stress

See tools/README.md for every option.


Documentation

Contributing

See CONTRIBUTING.md. Security reports go through SECURITY.md rather than the issue tracker.

Licence

MIT

About

Lightweight cross-platform desktop syslog viewer and analyzer. UDP/TCP/TLS, real-time filtering, FTS5 search, alerts, PKI assistant, at-rest encryption. Built with Go + Svelte (Wails).

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

12 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages