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>
pull/56843/head
Côme Chilliet 1 month ago
parent e5367e11ba
commit cb80ec7ebb
No known key found for this signature in database
GPG Key ID: A3E2F658B28C760A
  1. 5
      build/psalm-baseline.xml
  2. 2
      lib/private/AppFramework/Http/Request.php
  3. 21
      lib/private/Log/LogDetails.php

@ -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,

@ -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

@ -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

Loading…
Cancel
Save