{# 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 %}
Lines from {{ unnamed|map(attribute="address")|unique|join(", ") }} come through Docker's own address and carry no device name, so the devices sending them can't be told apart. Have each device put its hostname in its lines, or publish the port in host mode, as Point a device here shows.
{% endif %}In the device's remote syslog settings, send to {% if server %}{{ server }}{% else %}the IP address of a Docker host that publishes the port (ADDRESS below; set it under Settings → Plugins → Syslog, "Send to"){% endif %}, port {{ port }}, {{ proto }}. Either syslog format is read: the BSD one (RFC 3164) or the IETF one (RFC 5424), which is better where a device offers the choice, as 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 and protocol. Choose the IETF format if it is offered. |
| ASUSTOR (ADM) | In ADM's system log settings, send logs to a syslog server, with the server, port and protocol. ADM offers no format choice; Steward reads the BSD format it sends. |
| 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 {{ to }}:{{ 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) | *.* @{{ to }}:{{ port }} (UDP) or *.* @@{{ to }}:{{ port }} (TCP) in /etc/rsyslog.d/90-steward.conf, then restart rsyslog. |
ports:
- { target: {{ port }}, published: {{ port }}, protocol: udp }
- { target: {{ port }}, published: {{ port }}, protocol: tcp }
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 %} |
|---|---|---|---|---|
| {% if s.sender %}{{ s.sender }} through Docker's ingress, {{ s.address }} {% else %}{{ s.address }}{% if s.hostname_seen %}calls itself {{ s.hostname_seen }} {% endif %}{% if s.docker_address %}Docker's address, not the device's {% endif %}{% 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.sender %}through Docker's ingress {% elif 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.sender or s.address }}{% if s.sender %} through Docker's ingress, {{ s.address }} {% elif s.hostname_seen %}calls itself {{ s.hostname_seen }} {% endif %} |
{{ "{:,}".format(s.lines_total) }} | {{ s.last_seen_at|ago }} | {% if admin %}{% endif %} |