Skip to content

Commit d7622df

Browse files
Merge branch 'develop' into MCLOUD-12718
2 parents 19b776c + 2630271 commit d7622df

File tree

14 files changed

+294
-80
lines changed

14 files changed

+294
-80
lines changed

src/App/Logger/Formatter/JsonErrorFormatter.php

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -50,22 +50,42 @@ public function __construct(
5050
*
5151
* {@inheritDoc}
5252
*/
53-
public function format(array $record): string
53+
public function format(\Monolog\LogRecord|array $record): string
5454
{
55-
try {
56-
if (!isset($record['context']['errorCode'])) {
55+
// Monolog version 3 or higher.
56+
if (\Monolog\Logger::API == 3) {
57+
try {
58+
/** @phpstan-ignore-next-line */
59+
if (!isset($record->context['errorCode'])) {
60+
return '';
61+
}
62+
63+
$loggedErrors = $this->reader->read();
64+
65+
if (isset($loggedErrors[$record->context['errorCode']])) {
66+
return '';
67+
}
68+
69+
return $this->toJson($this->formatLog($record->toArray())) . PHP_EOL;
70+
} catch (\Exception $exception) {
5771
return '';
5872
}
59-
60-
$loggedErrors = $this->reader->read();
61-
62-
if (isset($loggedErrors[$record['context']['errorCode']])) {
73+
} else { // Older Monolog versions.
74+
try {
75+
if (!isset($record['context']['errorCode'])) {
76+
return '';
77+
}
78+
79+
$loggedErrors = $this->reader->read();
80+
81+
if (isset($loggedErrors[$record['context']['errorCode']])) {
82+
return '';
83+
}
84+
85+
return parent::format($this->formatLog($record));
86+
} catch (\Exception $exception) {
6387
return '';
6488
}
65-
66-
return parent::format($this->formatLog($record));
67-
} catch (\Exception $exception) {
68-
return '';
6989
}
7090
}
7191

src/App/Logger/Formatter/LineFormatter.php

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,30 +17,58 @@ class LineFormatter extends \Monolog\Formatter\LineFormatter
1717
public const FORMAT_BASE = "[%datetime%] %level_name%: %message%\n";
1818
public const FORMAT_BASE_ERROR = "[%datetime%] %level_name%: [%context.errorCode%] %message%\n";
1919

20-
/**
21-
* @inheritDoc
22-
*/
23-
public function format(array $record): string
20+
public function format(\Monolog\LogRecord|array $record): string
2421
{
2522
$errorLevels = [
2623
Logger::getLevelName(Logger::WARNING),
2724
Logger::getLevelName(Logger::ERROR),
2825
Logger::getLevelName(Logger::CRITICAL),
2926
];
3027

31-
if (isset($record['level_name'])
32-
&& in_array($record['level_name'], $errorLevels)
33-
&& !empty($record['context']['errorCode'])
28+
if ($record instanceof \Monolog\LogRecord) {
29+
$record = $this->formatNew($record, $errorLevels);
30+
} else { // Older Monolog versions.
31+
if (isset($record['level_name'])
32+
&& in_array($record['level_name'], $errorLevels)
33+
&& !empty($record['context']['errorCode'])
34+
) {
35+
$this->format = self::FORMAT_BASE_ERROR;
36+
} else {
37+
$this->format = self::FORMAT_BASE;
38+
}
39+
40+
if (isset($record['message']) && !empty($record['context']['suggestion'])) {
41+
$record['message'] .= PHP_EOL . $record['context']['suggestion'];
42+
}
43+
}
44+
45+
return parent::format($record);
46+
}
47+
48+
private function formatNew(\Monolog\LogRecord $record, array $errorLevels)
49+
{
50+
if (isset($record->level->name) // @phpstan-ignore-line
51+
&& in_array(strtoupper($record->level->name), $errorLevels)
52+
&& !empty($record->context['errorCode']) // @phpstan-ignore-line
3453
) {
3554
$this->format = self::FORMAT_BASE_ERROR;
3655
} else {
3756
$this->format = self::FORMAT_BASE;
3857
}
3958

40-
if (isset($record['message']) && !empty($record['context']['suggestion'])) {
41-
$record['message'] .= PHP_EOL . $record['context']['suggestion'];
59+
if (isset($record->message) && !empty($record->context['suggestion'])) { // @phpstan-ignore-line
60+
// Create new LogRecord from existing and update the message,
61+
// since message is read only
62+
$message = $record->message . PHP_EOL . $record->context['suggestion'];
63+
$record = new \Monolog\LogRecord( // @phpstan-ignore-line
64+
datetime: $record->datetime, // @phpstan-ignore-line
65+
channel: $record->channel, // @phpstan-ignore-line
66+
level: $record->level, // @phpstan-ignore-line
67+
message: $message,
68+
context: $record->context,
69+
extra: $record->extra, // @phpstan-ignore-line
70+
);
4271
}
43-
44-
return parent::format($record);
72+
return $record;
4573
}
4674
}

src/App/Logger/Gelf/Handler.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class Handler extends GelfHandler
2121
* @param array $record
2222
* @codeCoverageIgnore
2323
*/
24-
protected function write(array $record): void
24+
protected function write(\Monolog\LogRecord|array $record): void
2525
{
2626
try {
2727
parent::write($record);

src/App/Logger/Gelf/MessageFormatter.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
use Monolog\Formatter\GelfMessageFormatter;
1111
use Gelf\Message;
12+
use Monolog\LogRecord;
1213

1314
/**
1415
* Extends functionality of GelfMessageFormatter.
@@ -34,7 +35,7 @@ public function setAdditional(array $additional)
3435
/**
3536
* @inheritdoc
3637
*/
37-
public function format(array $record): Message
38+
public function format(\Monolog\LogRecord|array $record): Message
3839
{
3940
$message = parent::format($record);
4041

src/App/Logger/HandlerFactory.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@ public function create(string $handler): AbstractProcessingHandler
8080
try {
8181
$levelOverride = $this->globalConfig->get(GlobalSection::VAR_MIN_LOGGING_LEVEL);
8282
$minLevel = !empty($levelOverride) ? $this->normalizeLevel($levelOverride) : self::UNDEFINED_LEVEL;
83-
8483
$configuration = $this->logConfig->get($handler);
8584
} catch (ConfigException $exception) {
8685
throw new LoggerException($exception->getMessage(), $exception->getCode(), $exception);
@@ -173,6 +172,11 @@ private function normalizeLevel(string $level): int
173172
/** @phpstan-ignore-next-line */
174173
$normalizedLevel = Logger::toMonologLevel($level);
175174

175+
if (\Monolog\Logger::API == 3) {
176+
/** @phpstan-ignore-next-line */
177+
$normalizedLevel = $normalizedLevel->value;
178+
}
179+
176180
if (!is_int($normalizedLevel)) {
177181
throw new LoggerException('Logger lever is incorrect');
178182
}

src/App/Logger/Processor/SanitizeProcessor.php

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,26 @@ public function __construct(Sanitizer $sanitizer)
2929

3030
/**
3131
* Finds and replace sensitive data in record message.
32-
*
33-
* @param array $record
34-
* @return array
3532
*/
36-
public function __invoke(array $record)
33+
public function __invoke(\Monolog\LogRecord|array $record)
3734
{
38-
$record['message'] = $this->sanitizer->sanitize($record['message']);
39-
40-
return $record;
35+
// Monolog version 3 or higher.
36+
if (\Monolog\Logger::API == 3) {
37+
$message = $this->sanitizer->sanitize($record->message); // @phpstan-ignore-line
38+
// Create new LogRecord from existing and update the message,
39+
// since message is read only
40+
$record = new \Monolog\LogRecord( // @phpstan-ignore-line
41+
datetime: $record->datetime, // @phpstan-ignore-line
42+
channel: $record->channel, // @phpstan-ignore-line
43+
level: $record->level, // @phpstan-ignore-line
44+
message: $message,
45+
context: $record->context, // @phpstan-ignore-line
46+
extra: $record->extra, // @phpstan-ignore-line
47+
);
48+
return $record;
49+
} else { // Older Monolog versions.
50+
$record['message'] = $this->sanitizer->sanitize($record['message']);
51+
return $record;
52+
}
4153
}
4254
}

src/Step/ValidateConfiguration.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,9 @@ private function collectErrors(): array
9191
foreach ($this->validators as $level => $validators) {
9292
/** @phpstan-ignore-next-line */
9393
$level = Logger::toMonologLevel($level);
94+
if (!is_int($level)) {
95+
$level = $level->value;
96+
}
9497
foreach ($validators as $name => $validator) {
9598
if (!$validator instanceof ValidatorInterface) {
9699
$this->logger->info(sprintf('Validator "%s" was skipped', $name));

src/Test/Functional/Acceptance/ReportDirNestingLevelCest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
namespace Magento\MagentoCloud\Test\Functional\Acceptance;
99

1010
use Magento\MagentoCloud\Config\Stage\BuildInterface;
11+
1112
/**
1213
* This test runs on the latest version of PHP
1314
*

src/Test/Unit/App/Logger/Formatter/JsonErrorFormatterTest.php

Lines changed: 76 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,21 @@ public function testFormat(): void
5858
'type' => 'warning'
5959
]);
6060

61+
if (\Monolog\Logger::API == 3) {
62+
$logRecord = new \Monolog\LogRecord(
63+
datetime: new \DateTimeImmutable(),
64+
channel: 'testChannel',
65+
level: \Monolog\Level::Warning,
66+
message: 'some error',
67+
context: ['errorCode' => 11, ]
68+
);
69+
} else {
70+
$logRecord = ['message' => 'some error', 'context' => ['errorCode' => 11]];
71+
}
72+
6173
$this->assertEquals(
6274
'{"errorCode":11,"title":"some error","type":"warning"}' . PHP_EOL,
63-
$this->jsonErrorFormatter->format(['message' => 'some error', 'context' => ['errorCode' => 11]])
75+
$this->jsonErrorFormatter->format($logRecord)
6476
);
6577
}
6678

@@ -74,12 +86,24 @@ public function testFormatEmptyError(): void
7486
->with(11)
7587
->willReturn([]);
7688

77-
$this->assertEquals(
78-
'{"errorCode":11,"suggestion":"some suggestion","title":"some error"}' . PHP_EOL,
79-
$this->jsonErrorFormatter->format([
89+
if (\Monolog\Logger::API == 3) {
90+
$logRecord = new \Monolog\LogRecord(
91+
datetime: new \DateTimeImmutable(),
92+
channel: 'testChannel',
93+
level: \Monolog\Level::Warning,
94+
message: 'some error',
95+
context: ['errorCode' => 11, 'suggestion' => 'some suggestion']
96+
);
97+
} else {
98+
$logRecord = [
8099
'message' => 'some error',
81100
'context' => ['errorCode' => 11, 'suggestion' => 'some suggestion']
82-
])
101+
];
102+
}
103+
104+
$this->assertEquals(
105+
'{"errorCode":11,"suggestion":"some suggestion","title":"some error"}' . PHP_EOL,
106+
$this->jsonErrorFormatter->format($logRecord)
83107
);
84108
}
85109

@@ -93,8 +117,22 @@ public function testFormatMessageAlreadyLogged(): void
93117
$this->errorInfoMock->expects($this->never())
94118
->method('get');
95119

120+
if (\Monolog\Logger::API == 3) {
121+
$logRecord = new \Monolog\LogRecord(
122+
datetime: new \DateTimeImmutable(),
123+
channel: 'testChannel',
124+
level: \Monolog\Level::Warning,
125+
message: 'some error',
126+
context: ['errorCode' => 11]
127+
);
128+
} else {
129+
$logRecord = [
130+
'message' => 'some error',
131+
'context' => ['errorCode' => 11]
132+
];
133+
}
96134
$this->assertEmpty(
97-
$this->jsonErrorFormatter->format(['message' => 'some error', 'context' => ['errorCode' => 11]])
135+
$this->jsonErrorFormatter->format($logRecord)
98136
);
99137
}
100138

@@ -105,15 +143,43 @@ public function testFormatNoErrorCode(): void
105143
$this->errorInfoMock->expects($this->never())
106144
->method('get');
107145

108-
$this->assertEmpty($this->jsonErrorFormatter->format(['message' => 'test']));
146+
if (\Monolog\Logger::API == 3) {
147+
$logRecord = new \Monolog\LogRecord(
148+
datetime: new \DateTimeImmutable(),
149+
channel: 'testChannel',
150+
level: \Monolog\Level::Warning,
151+
message: 'test',
152+
context: []
153+
);
154+
} else {
155+
$logRecord = [
156+
'message' => 'test',
157+
'context' => []
158+
];
159+
}
160+
$this->assertEmpty($this->jsonErrorFormatter->format($logRecord));
109161
}
110162

111163
public function testFormatWithException(): void
112164
{
113-
$this->readerMock->expects($this->once())
165+
$this->readerMock->expects($this->any())
114166
->method('read')
115167
->willThrowException(new FileSystemException('error'));
116-
117-
$this->assertEmpty($this->jsonErrorFormatter->format(['message' => 'test', 'context' => ['errorCode' => 11]]));
168+
169+
if (\Monolog\Logger::API == 3) {
170+
$logRecord = new \Monolog\LogRecord(
171+
datetime: new \DateTimeImmutable(),
172+
channel: 'testChannel',
173+
level: \Monolog\Level::Warning,
174+
message: 'test',
175+
context: []
176+
);
177+
} else {
178+
$logRecord = [
179+
'message' => 'test',
180+
'context' => ['errorCode' => 11]
181+
];
182+
}
183+
$this->assertEmpty($this->jsonErrorFormatter->format($logRecord));
118184
}
119185
}

0 commit comments

Comments
 (0)