VLT-SYSLOGD

Manual

Veltrea Syslog Server (package name vlt-syslogd) receives syslog over UDP and displays it. This manual covers v0.4.0.

1. Which one do I install

There are three ways to run this. Decide what you are trying to do first. If you are unsure, take Portable: no service, no admin rights, running the moment you open it.

What you want What to install Sections
Just try it / keep it on one machine Portable only (no install) 23
Collect continuously (server use) Server (resident) + Console (the view) 45678
Look at a Server that already runs Console only 7

The three pieces

Name Executable Role
Portable vlt-syslogd-portable Self-contained GUI that opens the UDP socket itself.
Server vlt-syslogd-srv Headless engine. Receives over UDP and streams to Console.
Console vlt-syslogd-console GUI that attaches to Server over TCP.

On Windows each has a .exe suffix. Binaries are in GitHub Releases. To build from source, see BUILD.md; everything after the build is identical.

2. Trying Portable

Portable listens on UDP 514 by itself. Unpack it, open it, send a test message, and watch a row appear.

2.1 Windows

Unzip vlt-syslogd-portable-windows-v0.4.0.zip and double click vlt-syslogd-portable.exe. If SmartScreen appears, choose "More info" then "Run anyway". Windows has no privileged-port concept, so binding 514 needs no admin rights.

$u = New-Object System.Net.Sockets.UdpClient
$b = [Text.Encoding]::UTF8.GetBytes('<132>auth: login failed')
$u.Send($b, $b.Length, '127.0.0.1', 514) | Out-Null; $u.Close()

2.2 macOS

Open vlt-syslogd-macos-portable-v0.4.0.dmg and take out vlt-syslogd-portable.app. The macOS builds are ad-hoc signed and not notarized, so Gatekeeper stops the first launch. Either right click → Open once, or clear the quarantine flag.

xattr -dr com.apple.quarantine vlt-syslogd-portable.app

Clear the quarantine flag on the Portable variant

Portable keeps its data next to the .app. While the quarantine flag is present, App Translocation runs the app from a read-only copy elsewhere and that data location breaks.

printf '<34>Oct 11 22:14:15 myhost myapp: hello' | nc -u -w1 127.0.0.1 514

2.3 Linux

A single ELF binary. Make it executable and run it. 514 is a privileged port, so if the bind fails, run as root or grant CAP_NET_BIND_SERVICE.

chmod +x vlt-syslogd-linux-x86_64-portable-v0.4.0
./vlt-syslogd-linux-x86_64-portable-v0.4.0

The GUI needs a CJK font installed to render Japanese; without one you get tofu boxes. Install fonts-noto-cjk or equivalent.

3. Reading the log view

Portable — the log view Open full size

3.1 The five columns

Column What it holds
Time When it was received, to the millisecond — not the timestamp the sender claimed.
Tag The tag lifted from the front of the payload. It is filled only when there is a space-free word before the first colon, as in <PRI>tag: message; otherwise -.
Severity Taken from PRI: Emergency, Alert, Critical, Error, Warning, Notice, Informational, Debug — also distinguished by colour.
Enc The encoding used to decode this one message, and the evidence it was chosen on. See below.
Message The decoded payload.

Filter narrows by message and tag. Unchecking Auto-scroll stops the view following new rows, which is what you want when reading one line in a busy stream. 🗑 Clear discards the rows on screen; the log files on disk are untouched.

Right clicking a row offers Copy Message (the decoded text) and Copy as Hex (the bytes exactly as they arrived). When something looks wrong, the hex tells you whether the problem is on the wire or in the display.

3.2 What the Enc column means

The encoding is decided per message, not per connection, so a Shift_JIS appliance and a UTF-8 appliance can share one port.

Enc shows Meaning
UTF-8 / Shift_JIS Arrived in RFC 3164 or bare BSD framing and was decoded from the byte pattern.
Shift_JIS (MSG-SD/BOM-Missing) RFC 5424 structured data declared charset="Shift_JIS" and was believed. No BOM was present.
UTF-8 (MSG-UTF8/BOM) No declaration, but a BOM, so it was read as UTF-8.
UTF-8 (Implicit) Neither declaration nor BOM, but the bytes were valid UTF-8.
Shift_JIS (Guess) No evidence at all; inferred from the bytes.
system Not received at all — a line vlt-syslogd wrote itself, such as the bind result.

3.3 Preferences

The File menu opened, showing Preferences, Open log folder and Quit.
The File menu Besides Preferences, it opens the log directory in the OS file manager. On macOS these sit in the application menu instead.
File → Preferences… Two settings only: the listening port and where logs are written. "Apply" re-opens the socket. Open the whole window

The bind result appears as the first row of the log view (Listening on 0.0.0.0:514 (UDP)). If 514 is already held by another process, move to a port above 1024 here and point the sender at the same port.

The GUI listening address can also be overridden with the VLT_SYSLOGD_BIND environment variable, for example VLT_SYSLOGD_BIND=0.0.0.0:5514.

4. Running Server as a service

Server has no window. The bundled install script places the executable, creates the data directory, registers the service and starts it. Admin rights are needed only during install; after that it comes up with the machine.

4.1 Windows service

From an elevated PowerShell:

cd Server
powershell -ExecutionPolicy Bypass -File .\install-windows.ps1
Executable C:\Program Files\vlt-syslogd\vlt-syslogd-srv.exe
Data and logs C:\ProgramData\vlt-syslogd\
Service name vlt-syslogd-srv (startup type: automatic)
Check state sc.exe query vlt-syslogd-srv

The PowerShell scripts are deliberately ASCII-only so that a CP932 console cannot corrupt them. The prose lives here instead.

4.2 macOS / launchd

cd Server
sudo ./install-macos.sh
Executable /usr/local/bin/vlt-syslogd-srv
Data and logs /usr/local/var/vlt-syslogd/
LaunchDaemon /Library/LaunchDaemons/com.veltrea.vlt-syslogd-srv.plist
Check state sudo launchctl print system/com.veltrea.vlt-syslogd-srv

The LaunchDaemon runs as root, which is what lets it bind 514. That is why the installer asks for authentication.

4.3 Linux / systemd

cd Server
sudo ./install-linux.sh
Executable /usr/local/bin/vlt-syslogd-srv
Data and logs /var/lib/vlt-syslogd/
Unit /etc/systemd/system/vlt-syslogd-srv.service
Check state systemctl status vlt-syslogd-srv.service
Follow logs journalctl -u vlt-syslogd-srv.service -f

The unit runs as root by default so that it can open 514. If you would rather it did not, the unit file carries commented hints for a dedicated user plus AmbientCapabilities=CAP_NET_BIND_SERVICE.

5. The config file

Server writes config.toml into its data directory on first run. The defaults work, so read this only when you want to change ports or exposure.

[server]
bind_addr    = "0.0.0.0:514"        # syslog intake (UDP)
stream_addr  = "127.0.0.1:5141"     # stream to Console (TCP)
control_addr = "127.0.0.1:5142"     # control channel (TCP)

[logging]
level        = "info"
max_size_mb  = 10
keep_files   = 7

After editing, restart the service or use Console's Apply to server (restart). The data directory location can be overridden with VLT_SYSLOGD_DATA_DIR.

6. Network and firewall

The three ports are exposed differently on purpose.

Port Default bind Reachable from
514/udp (intake) 0.0.0.0 Any host, so remote devices can send.
5141/tcp (stream) 127.0.0.1 The same host only.
5142/tcp (control) 127.0.0.1 The same host only.

Both TCP channels are protected by a shared token (<data dir>/control.token, created by the installer owned by the admin user with mode 0600). Console on the same machine connects with no extra setup; other unprivileged users cannot.

Attaching Console from another machine

An SSH tunnel is the recommended route. If you instead expose the channels directly, Server refuses non-loopback stream_addr / control_addr unless VLT_SYSLOGD_ALLOW_NONLOOPBACK is set, and the connection still requires the token: paste the server's control.token value into Console's "control token" setting.

Firewall

Windows, from an elevated PowerShell:

New-NetFirewallRule -DisplayName "vlt-syslogd 514/udp" -Direction Inbound -Protocol UDP -LocalPort 514 -Action Allow

The macOS application firewall filters per application, not per port. Allow incoming connections for vlt-syslogd-srv at the prompt, or add it under System Settings → Network → Firewall → Options.

"Service running" does not mean "port reachable"

These are separate facts. When remote logs do not arrive, the cause is almost always the firewall or bind_addr.

7. Using Console

Console — attached to Server Open full size

Console does not need to be a service; just open the executable. After the first launch, open ⚙ Settings and check that it points at your Server.

  • Stream address → Server's stream_addr (default 127.0.0.1:5141)
  • Control address → Server's control_addr (default 127.0.0.1:5142)
Console settings The top half is Console's own connection; the bottom half is Server's configuration, read with "fetch current values" and written back with "apply to server (restart)" — active only when Server is registered as a service. Open full size

A green ● receiving at the top means the stream channel is live. The service start / stop / restart buttons work when Server was registered by the bundled installer.

  • Windows raises UAC; macOS asks for a password or Touch ID. Approving continues the action.
  • With no service registered, the action fails immediately with a plain message. Saving the settings still succeeds — only the restart is skipped.

8. Verifying it works

  1. Is the service running (as a service, not merely a process)?

    sc.exe query vlt-syslogd-srv                                   # Windows
    sudo launchctl print system/com.veltrea.vlt-syslogd-srv        # macOS
    systemctl status vlt-syslogd-srv.service                       # Linux
  2. Is it listening?

    Get-NetUDPEndpoint -LocalPort 514                              # Windows
    lsof -nP -iUDP:514                                            # macOS / Linux
  3. Send one message locally and watch Console:

    printf '<34>Oct 11 22:14:15 myhost myapp: hello' | nc -u -w1 127.0.0.1 514

    The indicator should turn green and a row should appear.

  4. Only if remote devices will send: check reachability from another host on the network. If nothing arrives, check bind_addr, then the firewall, then the sender's destination address.

9. Uninstalling

cd Server; powershell -ExecutionPolicy Bypass -File .\uninstall-windows.ps1   # Windows (elevated)
cd Server && sudo ./uninstall-macos.sh                                       # macOS
cd Server && sudo ./uninstall-linux.sh                                       # Linux

These stop and deregister the service and remove the executable they placed. Configuration and logs are left in the data directory. Delete it by hand (§11) to remove everything. Portable was never installed, so deleting the file is enough.

10. When something is wrong

Symptom Cause and fix
Japanese renders as empty boxes No CJK font on this Linux system. Install fonts-noto-cjk or equivalent and restart the app.
macOS says the app is damaged and will not open The quarantine flag on an ad-hoc signed download. Right click → Open, or xattr -dr com.apple.quarantine <app>.
It starts but nothing ever arrives Check the bind result in the first row. If it failed, change the port. If it succeeded, check the sender's destination and the firewall.
Console always shows "disconnected" Server is not running, or the stream address does not match. Confirm Server is up and that Console's stream address equals Server's stream_addr.
"Fetch current values" fails Control address mismatch, or an older Server without the control channel. Check control_addr and reinstall Server.
Console still reports "not installed" after installing Happens when the service name or launchd label was changed by hand. Console and the installer must name the same identifier (§11).
Service is running but remote logs never arrive Running is not the same as reachable. Check (1) bind_addr is 0.0.0.0 or a LAN IP and not 127.0.0.1, (2) the firewall allows UDP 514, (3) the sender points at this machine's real address.
Remote Console cannot connect stream_addr and control_addr are loopback-only by default. Prefer an SSH tunnel. To expose them directly you need VLT_SYSLOGD_ALLOW_NONLOOPBACK on the server and the control token pasted into Console.
Console output is garbled on Windows The console is CP932. The installer and service are ASCII-only, so this does not affect operation.
The install script will not run on Windows Open PowerShell as administrator and include -ExecutionPolicy Bypass.

11. Identifiers and paths

OS Service identifier Data directory
Windows vlt-syslogd-srv C:\ProgramData\vlt-syslogd\
macOS com.veltrea.vlt-syslogd-srv /usr/local/var/vlt-syslogd/
Linux vlt-syslogd-srv.service /var/lib/vlt-syslogd/

Environment variables

VLT_SYSLOGD_BIND Overrides the listening address of the GUI (Portable).
VLT_SYSLOGD_DATA_DIR Overrides Server's data directory.
VLT_SYSLOGD_CONSOLE_DATA_DIR Overrides where Console keeps its own settings.
VLT_SYSLOGD_ALLOW_NONLOOPBACK Permits non-loopback stream_addr / control_addr. Refused by default.

For the full architecture see the reference, and for per-OS detail see DOCS/.