{# 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) }}
{% if listener.error %}{{ status_badge('down', 'Not listening') }} {% elif listener.listening %}{{ status_badge('up', 'Listening') }} {% elif not listener.protocols %}{{ status_badge('inactive', 'Off') }} {% else %}{{ status_badge('pending', 'Starting') }}{% endif %}

Listener

{% if listener.protocols %}{{ listener.protocols|join(" and ") }} port {{ listener.port }}{% endif %} {% if admin %}Settings{% endif %}
{% if listener.error %}

{{ 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.

{% elif not listener.protocols %}

UDP and TCP are both off in Settings, so nothing is received.

{% else %}

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 %}

{% endif %} {% if listener.dropped %}

{{ "{:,}".format(listener.dropped) }} line{{ "s" if listener.dropped != 1 }} lost: they arrived faster than they could be read.

{% endif %} {% if listener.senders_full %}

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.

{% endif %}
{% set unnamed = (offered + sources)|selectattr("docker_address")|rejectattr("sender")|list %} {% if unnamed %}

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 %}
Point a device here {% set port = listener.port %} {% set proto = listener.protocols|join(" or ") or "UDP or TCP" %} {% set to = server or "ADDRESS" %}

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.

DeviceWhere
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.
TrueNASSystem → Advanced Settings → Syslog: the remote syslog server as {{ to }}:{{ port }}, and its transport.
OpenWrtSystem → System → Logging: the external system log server, its port and protocol.
UniFiNetwork 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.

Nothing arriving?

ports:
  - { target: {{ port }}, published: {{ port }}, protocol: udp }
  - { target: {{ port }}, published: {{ port }}, protocol: tcp }
{% if offered %}

Sending, not added

These devices are sending syslog. Their lines are counted and not kept until you add them.

{% if admin %}{% endif %} {% for s in offered %} {% if admin %} {% endif %} {% endfor %}
SenderLinesLast heardNewest line
{% 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 }} {{ s.severity or "" }} {{ s.last_line or "—" }}
{{ csrf_field() }}
{{ csrf_field() }}
{% endif %}

Sources

Patterns
{% if not sources %} {{ empty_state("No sources yet. Point a NAS, router or other device at this server's syslog port: it shows above as sending, and Add keeps its lines.") }} {% else %} {% if admin %}{% endif %} {% for s in sources %} {% if admin %}{% endif %} {% endfor %}
SourceHostLast hourLast heardNewest line
{{ 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 }} {{ s.severity or "" }} {{ s.last_line or "—" }}Edit
{% endif %}
{% if ignored %}
Ignored ({{ ignored|length }}) {% if admin %}{% endif %} {% for s in ignored %} {% if admin %}{% endif %} {% endfor %}
SenderLinesLast heard
{{ 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 }}
{{ csrf_field() }}
{% endif %} {% endblock %}