diff options
Diffstat (limited to 'lib/private/Log/Systemdlog.php')
-rw-r--r-- | lib/private/Log/Systemdlog.php | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/lib/private/Log/Systemdlog.php b/lib/private/Log/Systemdlog.php new file mode 100644 index 00000000000..ffea0511732 --- /dev/null +++ b/lib/private/Log/Systemdlog.php @@ -0,0 +1,66 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OC\Log; + +use OC\SystemConfig; +use OCP\HintException; +use OCP\ILogger; +use OCP\Log\IWriter; + +// The following fields are understood by systemd/journald, see +// man systemd.journal-fields. All are optional: +// MESSAGE= +// The human-readable message string for this entry. +// MESSAGE_ID= +// A 128-bit message identifier ID +// PRIORITY= +// A priority value between 0 ("emerg") and 7 ("debug") +// CODE_FILE=, CODE_LINE=, CODE_FUNC= +// The code location generating this message, if known +// ERRNO= +// The low-level Unix error number causing this entry, if any. +// SYSLOG_FACILITY=, SYSLOG_IDENTIFIER=, SYSLOG_PID= +// Syslog compatibility fields + +class Systemdlog extends LogDetails implements IWriter { + protected array $levels = [ + ILogger::DEBUG => 7, + ILogger::INFO => 6, + ILogger::WARN => 4, + ILogger::ERROR => 3, + ILogger::FATAL => 2, + ]; + + protected string $syslogId; + + public function __construct( + SystemConfig $config, + ?string $tag = null, + ) { + parent::__construct($config); + if (!function_exists('sd_journal_send')) { + throw new HintException( + 'PHP extension php-systemd is not available.', + 'Please install and enable PHP extension systemd if you wish to log to the Systemd journal.'); + } + if ($tag === null) { + $tag = $config->getValue('syslog_tag', 'Nextcloud'); + } + $this->syslogId = $tag; + } + + /** + * Write a message to the log. + * @param string|array $message + */ + public function write(string $app, $message, int $level): void { + $journal_level = $this->levels[$level]; + sd_journal_send('PRIORITY=' . $journal_level, + 'SYSLOG_IDENTIFIER=' . $this->syslogId, + 'MESSAGE=' . $this->logDetailsAsJSON($app, $message, $level)); + } +} |