diff --git a/docs/index.rst b/docs/index.rst
index 0d8f1de97268dd071abfea496fe1b656682d4455..680e946da1cf0e5a7f1ce0c5f3114dae0922f0ec 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -65,6 +65,7 @@ Several Freifunk communities in Germany use Gluon as the foundation of their Fre
    package/gluon-ebtables-limit-arp
    package/gluon-ebtables-source-filter
    package/gluon-hoodselector
+   package/gluon-logging
    package/gluon-mesh-batman-adv
    package/gluon-mesh-wireless-sae
    package/gluon-radv-filterd
diff --git a/docs/package/gluon-logging.rst b/docs/package/gluon-logging.rst
new file mode 100644
index 0000000000000000000000000000000000000000..279d39a36236c831e170137d8e833d5b07f77571
--- /dev/null
+++ b/docs/package/gluon-logging.rst
@@ -0,0 +1,37 @@
+gluon-logging
+=============
+
+The *gluon-logging* package allows to configure a remote syslog server that
+will receive the systems log output that is also visible when calling ``logread``
+from a terminal.
+
+It supports both IPv4 and IPv6 endpoints over UDP and TCP.
+
+Note: The syslog mechanism is incapable of providing a complete log as network
+access is required to send out log messages and ``logd`` does not buffer and resend
+older log messages even though they might be available in ``logread``.
+
+This package conflicts with ``gluon-web-logging`` as it will overwrite the
+user-given syslog server on every upgrade.
+
+site.conf
+---------
+
+syslog.ip : required
+    - Destination address of the remote syslog server
+
+syslog.port : optional
+    - Destination port of the remote syslog server
+    - Defaults to 514
+
+syslog.proto : optional
+    - Protocol to transport syslog frames in, can be either ``tcp`` or ``udp``
+    - Defaults to UDP
+
+Example::
+
+  syslog = {
+    ip = "2001:db8::1",
+    port = 514,
+    proto = "udp",
+  },
diff --git a/package/gluon-logging/Makefile b/package/gluon-logging/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..735a6f9e3bd79375257f94e92c67825fad4de18f
--- /dev/null
+++ b/package/gluon-logging/Makefile
@@ -0,0 +1,15 @@
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=gluon-logging
+PKG_VERSION:=1
+
+include ../gluon.mk
+
+define Package/gluon-logging
+  TITLE:=Configure remote syslog from site.conf
+  DEPENDS:=+gluon-core
+  CONFLICTS:=gluon-web-logging
+endef
+
+$(eval $(call BuildPackageGluon,gluon-logging))
+
diff --git a/package/gluon-logging/check_site.lua b/package/gluon-logging/check_site.lua
new file mode 100644
index 0000000000000000000000000000000000000000..8ee0c032af1ee996f3e5d36c9dcbcaa98925eea0
--- /dev/null
+++ b/package/gluon-logging/check_site.lua
@@ -0,0 +1,3 @@
+need_string({'syslog', 'ip'}, true)
+need_number_range({'syslog', 'port'}, 1, 65535, false)
+need_one_of({'syslog', 'proto'}, {'tcp', 'udp'}, false)
diff --git a/package/gluon-logging/luasrc/lib/gluon/upgrade/040-syslog b/package/gluon-logging/luasrc/lib/gluon/upgrade/040-syslog
new file mode 100755
index 0000000000000000000000000000000000000000..03c34efe7649b5e0b2f7b9d42bd2192bfaf13ecc
--- /dev/null
+++ b/package/gluon-logging/luasrc/lib/gluon/upgrade/040-syslog
@@ -0,0 +1,19 @@
+#!/usr/bin/lua
+local site = require('gluon.site')
+local uci = require('simple-uci').cursor()
+
+local system = uci:get_first('system', 'system')
+
+if not site.syslog.ip() then
+	uci:delete('system', system, 'log_remote')
+	uci:delete('system', system, 'log_ip')
+	uci:delete('system', system, 'log_port')
+	uci:delete('system', system, 'log_proto')
+else
+	uci:set('system', system, 'log_remote', 1)
+	uci:set('system', system, 'log_ip', site.syslog.ip())
+	uci:set('system', system, 'log_port', site.syslog.port(514))
+	uci:set('system', system, 'log_proto', site.syslog.proto('udp'))
+end
+
+uci:save('system')