{# plugins/syslog/templates/syslog/index.html — whether Steward is listening,
the sources whose lines are kept, and the devices sending that haven't been
added: counted, never stored, until an admin adds one (#5999). #}
{% extends "base.html" %}
{% from "_macros.html" import page_header, status_badge, empty_state %}
{% from "syslog/_tone.html" import tone %}
{% block title %}Syslog — Steward{% endblock %}
{% block content %}
{% set admin = session.user_role == 'admin' %}
{{ page_header("Syslog", (sources|length ~ " source" ~ ("s" if sources|length != 1 else "")) if sources else none) }}
{{ listener.error }} Tried again every minute. Another program may hold the port, or it is below 1024, which Steward can't open: choose another in Settings. UDP and TCP are both off in Settings, so nothing is received.
Point a device's remote syslog at this server, {{ listener.protocols|join(" or ") }} port {{ listener.port }}.
{%- if listener.bound_at %} Open since {{ listener.bound_at|ago }}: {{ "{:,}".format(listener.received) }} line{{ "s" if listener.received != 1 }} received{% if listener.connections %}, {{ listener.connections }} TCP sender{{ "s" if listener.connections != 1 }} connected{% endif %}.{% endif %}
{{ "{:,}".format(listener.dropped) }} line{{ "s" if listener.dropped != 1 }} lost: they arrived faster than they could be read. Steward knows {{ listener.max_senders }} senders, the most it keeps; a new one is counted, not offered{% if listener.unoffered %} ({{ "{:,}".format(listener.unoffered) }} line{{ "s" if listener.unoffered != 1 }} so far){% endif %}. Remove ones you don't need.Listener
{% if listener.protocols %}{{ listener.protocols|join(" and ") }} port {{ listener.port }}{% endif %}
{% if admin %}Settings{% endif %}
{{ hidden_senders|map(attribute="address")|unique|join(", ") }} {{ "is" if hidden_senders|map(attribute="address")|unique|list|length == 1 else "are" }} on Steward's own container network: Docker is most likely standing in for the real devices, so they all read as one sender. Publish the port in host mode, as Point a device here shows.
{% endif %}In the device's remote syslog settings, send to {{ server }}, port {{ port }}, {{ proto }}. If the device can't resolve that name, use the server's IP address. Choose the RFC 5424 (IETF) format where it is offered: its lines carry their zone. Once a device sends, it appears above as sending, and Add keeps its lines.
| Device | Where |
|---|---|
| Synology (DSM) | Log Center → Log Sending: send logs to a syslog server, with the server, port, protocol and the IETF format. |
| QNAP (QTS) | QuLog Center → Log Sender: add a destination with the server, port, protocol and RFC 5424. |
| TrueNAS | System → Advanced Settings → Syslog: the remote syslog server as {{ server }}:{{ port }}, and its transport. |
| OpenWrt | System → System → Logging: the external system log server, its port and protocol. |
| UniFi | Network settings, under remote logging (named Activity Logging or SIEM server in newer versions): the server and port. |
| Linux (rsyslog) | *.* @{{ server }}:{{ port }} (UDP) or *.* @@{{ server }}:{{ port }} (TCP) in /etc/rsyslog.d/90-steward.conf, then restart rsyslog. |
ports:
- { target: {{ port }}, published: {{ port }}, protocol: udp, mode: host }
- { target: {{ port }}, published: {{ port }}, protocol: tcp, mode: host }
These devices are sending syslog. Their lines are counted and not kept until you add them.
| Sender | Lines | Last heard | Newest line | {% if admin %}{% endif %} |
|---|---|---|---|---|
| {{ s.address }}{% if s.hostname_seen %} calls itself {{ s.hostname_seen }} {% endif %}{% if s.docker_address %}Docker's address, not the device's {% endif %} |
{{ "{:,}".format(s.lines_total) }} | {{ s.last_seen_at|ago }} | {% if admin %}{% endif %} |
| Source | Host | Last hour | Last heard | Newest line | {% if admin %}{% endif %} |
|---|---|---|---|---|---|
| {{ s.name }} {{ s.address }} {% if s.docker_address %}Docker's address, not the device's {% endif %} |
{% if s.host %}{{ s.host.name }}{% else %}—{% endif %} | {{ "{:,}".format(s.rate or 0) }} | {{ s.last_seen_at|ago }} | {% if admin %}Edit | {% endif %}
| Sender | Lines | Last heard | {% if admin %}{% endif %} |
|---|---|---|---|
| {{ s.address }}{% if s.hostname_seen %} calls itself {{ s.hostname_seen }} {% endif %} |
{{ "{:,}".format(s.lines_total) }} | {{ s.last_seen_at|ago }} | {% if admin %}{% endif %} |