feat(log): Add script name and occ command to log details

This will help when troubleshooting issues. For web request we have
 method and url, but for cron and occ currently we have no way to know if
 it’s one or the other and which command.

Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
This commit is contained in:
Côme Chilliet
2025-12-04 12:03:31 +01:00
parent e5367e11ba
commit cb80ec7ebb
3 changed files with 17 additions and 11 deletions

View File

@@ -3951,11 +3951,6 @@
<code><![CDATA[$limit === null]]></code>
</TypeDoesNotContainNull>
</file>
<file src="lib/private/Log/LogDetails.php">
<RedundantCondition>
<code><![CDATA[is_string($request->getMethod())]]></code>
</RedundantCondition>
</file>
<file src="lib/private/Log/Systemdlog.php">
<UndefinedFunction>
<code><![CDATA[sd_journal_send('PRIORITY=' . $journal_level,

View File

@@ -769,7 +769,7 @@ class Request implements \ArrayAccess, \Countable, IRequest {
* @return string the script name
*/
public function getScriptName(): string {
$name = $this->server['SCRIPT_NAME'];
$name = $this->server['SCRIPT_NAME'] ?? '';
$overwriteWebRoot = $this->config->getSystemValueString('overwritewebroot');
if ($overwriteWebRoot !== '' && $this->isOverwriteCondition()) {
// FIXME: This code is untestable due to __DIR__, also that hardcoded path is really dangerous

View File

@@ -1,12 +1,17 @@
<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OC\Log;
use OC\SystemConfig;
use OCP\IRequest;
use OCP\Server;
abstract class LogDetails {
public function __construct(
@@ -14,7 +19,7 @@ abstract class LogDetails {
) {
}
public function logDetails(string $app, $message, int $level): array {
public function logDetails(string $app, string|array $message, int $level): array {
// default to ISO8601
$format = $this->config->getValue('logdateformat', \DateTimeInterface::ATOM);
$logTimeZone = $this->config->getValue('logtimezone', 'UTC');
@@ -30,13 +35,13 @@ abstract class LogDetails {
// apply timezone if $time is created from UNIX timestamp
$time->setTimezone($timezone);
}
$request = \OC::$server->getRequest();
$request = Server::get(IRequest::class);
$reqId = $request->getId();
$remoteAddr = $request->getRemoteAddress();
// remove username/passwords from URLs before writing the to the log file
$time = $time->format($format);
$url = ($request->getRequestUri() !== '') ? $request->getRequestUri() : '--';
$method = is_string($request->getMethod()) ? $request->getMethod() : '--';
$method = $request->getMethod();
if ($this->config->getValue('installed', false)) {
$user = \OC_User::getUser() ?: '--';
} else {
@@ -47,6 +52,7 @@ abstract class LogDetails {
$userAgent = '--';
}
$version = $this->config->getValue('version', '');
$scriptName = $request->getScriptName();
$entry = compact(
'reqId',
'level',
@@ -56,14 +62,19 @@ abstract class LogDetails {
'app',
'method',
'url',
'scriptName',
'message',
'userAgent',
'version'
'version',
);
$clientReqId = $request->getHeader('X-Request-Id');
if ($clientReqId !== '') {
$entry['clientReqId'] = $clientReqId;
}
if (\OC::$CLI) {
/* Only logging the command, not the parameters */
$entry['occ_command'] = array_slice($_SERVER['argv'] ?? [], 0, 2);
}
if (is_array($message)) {
// Exception messages are extracted and the exception is put into a separate field
@@ -82,7 +93,7 @@ abstract class LogDetails {
return $entry;
}
public function logDetailsAsJSON(string $app, $message, int $level): string {
public function logDetailsAsJSON(string $app, string|array $message, int $level): string {
$entry = $this->logDetails($app, $message, $level);
// PHP's json_encode only accept proper UTF-8 strings, loop over all
// elements to ensure that they are properly UTF-8 compliant or convert