diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index fa94023..e1577f6 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -8,26 +8,38 @@ on: jobs: tests: + runs-on: ubuntu-22.04 - runs-on: ubuntu-latest strategy: fail-fast: true matrix: - php: [7.2, 7.3, 7.4, 8.0, 8.1] - laravel: [^6.0, ^7.0, ^8.0, ^9.0] + php: [7.2, 7.3, 7.4, 8.0, 8.1, 8.2] + laravel: [^6.0, ^7.0, ^8.0, ^9.0, ^10.0] exclude: - php: 7.2 laravel: ^8.0 - php: 7.2 laravel: ^9.0 + - php: 7.2 + laravel: ^10.0 - php: 7.3 laravel: ^9.0 + - php: 7.3 + laravel: ^10.0 - php: 7.4 laravel: ^9.0 + - php: 7.4 + laravel: ^10.0 + - php: 8.0 + laravel: ^10.0 - php: 8.1 laravel: ^6.0 - php: 8.1 laravel: ^7.0 + - php: 8.2 + laravel: ^6.0 + - php: 8.2 + laravel: ^7.0 name: P${{ matrix.php }} - L${{ matrix.laravel }} @@ -56,7 +68,7 @@ jobs: run: | composer require laravel/octane --dev if: | - matrix.php >= 8.0 && (matrix.laravel == '^8.0' || matrix.laravel == '^9.0') + matrix.php >= 8.0 && (matrix.laravel == '^8.0' || matrix.laravel == '^9.0' || matrix.laravel == '^10.0') - name: Execute unit tests run: vendor/bin/phpunit diff --git a/composer.json b/composer.json index 17e8149..e37a7cc 100644 --- a/composer.json +++ b/composer.json @@ -18,11 +18,11 @@ "aws/aws-sdk-php": "^3.80", "guzzlehttp/guzzle": "^6.3|^7.0", "hollodotme/fast-cgi-client": "^3.0", - "illuminate/container": "^6.0|^7.0|^8.0|^9.0", - "illuminate/http": "^6.0|^7.0|^8.0|^9.0", - "illuminate/queue": "^6.0|^7.0|^8.0|^9.0", - "illuminate/support": "^6.0|^7.0|^8.0|^9.0", - "monolog/monolog": "^1.12|^2.0", + "illuminate/container": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/http": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/queue": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0", + "monolog/monolog": "^1.12|^2.0|^3.2", "nyholm/psr7": "^1.0", "riverline/multipart-parser": "^2.0.9", "symfony/process": "^4.3|^5.0|^6.0", @@ -30,7 +30,7 @@ }, "require-dev": { "mockery/mockery": "^1.2", - "orchestra/testbench": "^4.0|^5.0|^6.0|^7.0", + "orchestra/testbench": "^4.0|^5.0|^6.0|^7.0|^8.0", "phpunit/phpunit": "^8.0|^9.0" }, "autoload": { diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 9009d22..d45efe2 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -7,6 +7,7 @@ convertErrorsToExceptions="true" convertNoticesToExceptions="true" convertWarningsToExceptions="true" + convertDeprecationsToExceptions="true" processIsolation="false" stopOnFailure="false" > @@ -18,18 +19,6 @@ ./tests/Feature - - - src/ - - - - - - - - - diff --git a/src/Logging/JsonFormatter.php b/src/Logging/JsonFormatter.php index 5ccab68..e63ee50 100644 --- a/src/Logging/JsonFormatter.php +++ b/src/Logging/JsonFormatter.php @@ -3,17 +3,32 @@ namespace Laravel\Vapor\Logging; use Monolog\Formatter\JsonFormatter as BaseJsonFormatter; +use Monolog\LogRecord; class JsonFormatter extends BaseJsonFormatter { /** * {@inheritdoc} */ - public function format(array $record): string + public function format($record): string { - $record['context'] = array_merge( - $record['context'] ?? [], ['aws_request_id' => ($_ENV['AWS_REQUEST_ID'] ?? null)] - ); + $context = ['aws_request_id' => ($_ENV['AWS_REQUEST_ID'] ?? null)]; + + if ($record instanceof LogRecord) { + $record = new LogRecord( + $record->datetime, + $record->channel, + $record->level, + $record->message, + array_merge($record->context, $context), + $record->extra, + $record->formatted + ); + } else { + $record['context'] = array_merge( + $record['context'] ?? [], $context + ); + } return parent::format($record); } diff --git a/tests/Unit/Logging/JsonFormatterTest.php b/tests/Unit/Logging/JsonFormatterTest.php new file mode 100644 index 0000000..0bcaae9 --- /dev/null +++ b/tests/Unit/Logging/JsonFormatterTest.php @@ -0,0 +1,147 @@ + 'context-value'], + ['extra-test' => 'extra-value'] + ); + } else { + $record = [ + 'datetime' => new \DateTimeImmutable(), + 'channel' => 'channel-test', + 'level' => 200, + 'level_name' => 'INFO', + 'message' => 'message-test', + 'context' => ['context-test' => 'context-value'], + 'extra' => ['extra-test' => 'extra-value'], + ]; + } + + $_ENV['AWS_REQUEST_ID'] = '123456789'; + + $record = $formatter->format($record); + $this->assertJson($record); + + $record = json_decode($record, true); + + if (class_exists(LogRecord::class)) { + $this->assertSame([ + 'message' => 'message-test', + 'context' => [ + 'context-test' => 'context-value', + 'aws_request_id' => '123456789', + ], + 'level' => 200, + 'level_name' => 'INFO', + 'channel' => 'channel-test', + 'datetime' => $record['datetime'], + 'extra' => [ + 'extra-test' => 'extra-value', + ], + ], $record); + } else { + $this->assertSame([ + 'datetime' => $record['datetime'], + 'channel' => 'channel-test', + 'level' => 200, + 'level_name' => 'INFO', + 'message' => 'message-test', + 'context' => [ + 'context-test' => 'context-value', + 'aws_request_id' => '123456789', + ], + 'extra' => [ + 'extra-test' => 'extra-value', + ], + ], $record); + } + } + + public function test_includes_aws_request_id() + { + $formatter = new JsonFormatter(); + + $_ENV['AWS_REQUEST_ID'] = '123456789'; + + if (class_exists(LogRecord::class)) { + $record = new LogRecord( + new \DateTimeImmutable(), + 'channel-test', + Level::Info, + 'message-test', + ['foo' => 'bar'] + ); + } else { + $record = [ + 'datetime' => new \DateTimeImmutable(), + 'channel' => 'channel-test', + 'level' => 200, + 'level_name' => 'INFO', + 'message' => 'message-test', + 'context' => ['foo' => 'bar'], + 'extra' => [], + ]; + } + + $record = $formatter->format($record); + $this->assertJson($record); + + $record = json_decode($record, true); + $this->assertSame(['foo' => 'bar', 'aws_request_id' => '123456789'], $record['context']); + } + + public function test_aws_request_id_may_be_null() + { + $formatter = new JsonFormatter(); + + if (class_exists(LogRecord::class)) { + $record = new LogRecord( + new \DateTimeImmutable(), + 'channel-test', + Level::Info, + 'message-test' + ); + } else { + $record = [ + 'datetime' => new \DateTimeImmutable(), + 'channel' => 'channel-test', + 'level' => 200, + 'level_name' => 'INFO', + 'message' => 'message-test', + 'context' => [], + 'extra' => [], + ]; + } + + $record = $formatter->format($record); + $this->assertJson($record); + + $record = json_decode($record, true); + $this->assertSame(['aws_request_id' => null], $record['context']); + } +}