[php-slim4] Add monolog package as default logger (#12137)

* Add monolog to templates

* Remove default values from DI\get helper

It turned out \DI\get expects only single argument, current method call
doesn't throw any errors but it should be corrected anyway.

* Refresh samples
This commit is contained in:
Yuriy Belenko 2022-04-16 11:20:05 +03:00 committed by GitHub
parent c533deb9a9
commit 0e9d6b09be
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 118 additions and 8 deletions

View File

@ -242,6 +242,8 @@ public class PhpSlim4ServerCodegen extends AbstractPhpCodegen {
supportingFiles.add(new SupportingFile("htaccess_deny_all", "config", ".htaccess")); supportingFiles.add(new SupportingFile("htaccess_deny_all", "config", ".htaccess"));
supportingFiles.add(new SupportingFile("config_dev_default.mustache", "config" + File.separator + "dev", "default.inc.php")); supportingFiles.add(new SupportingFile("config_dev_default.mustache", "config" + File.separator + "dev", "default.inc.php"));
supportingFiles.add(new SupportingFile("config_prod_default.mustache", "config" + File.separator + "prod", "default.inc.php")); supportingFiles.add(new SupportingFile("config_prod_default.mustache", "config" + File.separator + "prod", "default.inc.php"));
// add restricted htaccess to create log folder
supportingFiles.add(new SupportingFile("htaccess_deny_all", "logs", ".htaccess"));
if (Boolean.TRUE.equals(generateModels)) { if (Boolean.TRUE.equals(generateModels)) {
supportingFiles.add(new SupportingFile("base_model.mustache", toSrcPath(invokerPackage, srcBasePath), "BaseModel.php")); supportingFiles.add(new SupportingFile("base_model.mustache", toSrcPath(invokerPackage, srcBasePath), "BaseModel.php"));

View File

@ -131,6 +131,11 @@ Used packages:
* [Openapi Data Mocker Server Middleware](https://github.com/ybelenko/openapi-data-mocker-server-middleware) - PSR-15 HTTP server middleware. * [Openapi Data Mocker Server Middleware](https://github.com/ybelenko/openapi-data-mocker-server-middleware) - PSR-15 HTTP server middleware.
* [Openapi Data Mocker Interfaces](https://github.com/ybelenko/openapi-data-mocker-interfaces) - package with mocking interfaces. * [Openapi Data Mocker Interfaces](https://github.com/ybelenko/openapi-data-mocker-interfaces) - package with mocking interfaces.
## Logging
Build contains pre-configured [`monolog/monolog`](https://github.com/Seldaek/monolog) package. Make sure that `logs` folder is writable.
Add required log handlers/processors/formatters in `{{srcBasePath}}/App/RegisterDependencies.php`.
{{#generateApiDocs}} {{#generateApiDocs}}
## API Endpoints ## API Endpoints

View File

@ -17,6 +17,7 @@
{{#isZendDiactoros}} {{#isZendDiactoros}}
"laminas/laminas-diactoros": "^2.3.0", "laminas/laminas-diactoros": "^2.3.0",
{{/isZendDiactoros}} {{/isZendDiactoros}}
"monolog/monolog": "^2.4",
"neomerx/cors-psr7": "^2.0", "neomerx/cors-psr7": "^2.0",
{{#isNyholmPsr7}} {{#isNyholmPsr7}}
"nyholm/psr7": "^1.3.0", "nyholm/psr7": "^1.3.0",

View File

@ -95,4 +95,10 @@ return [
return $response->withHeader('X-{{invokerPackage}}-Mock', 'pong'); return $response->withHeader('X-{{invokerPackage}}-Mock', 'pong');
}; };
}, },
// logger
'logger.name' => 'App',
'logger.path' => \realpath(__DIR__ . '/../../logs') . '/app.log',
'logger.level' => 100, // equals DEBUG level
'logger.options' => [],
]; ];

View File

@ -62,4 +62,10 @@ return [
'pdo.options' => [ 'pdo.options' => [
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
], ],
// logger
'logger.name' => 'App',
'logger.path' => \realpath(__DIR__ . '/../../logs') . '/app.log',
'logger.level' => 300, // equals WARNING level
'logger.options' => [],
]; ];

View File

@ -22,3 +22,7 @@ composer.phar
!/config/.htaccess !/config/.htaccess
!/config/dev/default.inc.php !/config/dev/default.inc.php
!/config/prod/default.inc.php !/config/prod/default.inc.php
# Logs folder
/logs/**/*.*
!/logs/.htaccess

View File

@ -8,6 +8,9 @@
<!-- Don't need to inspect installed packages --> <!-- Don't need to inspect installed packages -->
<exclude-pattern>./vendor</exclude-pattern> <exclude-pattern>./vendor</exclude-pattern>
<!-- Don't need to scan logs -->
<exclude-pattern>./logs</exclude-pattern>
<!-- <basepath> A path to strip from the front of file paths inside reports --> <!-- <basepath> A path to strip from the front of file paths inside reports -->
<arg name="basepath" value="."/> <arg name="basepath" value="."/>

View File

@ -41,9 +41,10 @@ final class RegisterDependencies
// Slim error middleware // Slim error middleware
// @see https://www.slimframework.com/docs/v4/middleware/error-handling.html // @see https://www.slimframework.com/docs/v4/middleware/error-handling.html
\Slim\Middleware\ErrorMiddleware::class => \DI\autowire() \Slim\Middleware\ErrorMiddleware::class => \DI\autowire()
->constructorParameter('displayErrorDetails', \DI\get('slim.displayErrorDetails', false)) ->constructorParameter('displayErrorDetails', \DI\get('slim.displayErrorDetails'))
->constructorParameter('logErrors', \DI\get('slim.logErrors', true)) ->constructorParameter('logErrors', \DI\get('slim.logErrors'))
->constructorParameter('logErrorDetails', \DI\get('slim.logErrorDetails', true)), ->constructorParameter('logErrorDetails', \DI\get('slim.logErrorDetails'))
->constructorParameter('logger', \DI\get(\Psr\Log\LoggerInterface::class)),
// CORS // CORS
\Neomerx\Cors\Contracts\AnalysisStrategyInterface::class => \DI\create(\Neomerx\Cors\Strategies\Settings::class) \Neomerx\Cors\Contracts\AnalysisStrategyInterface::class => \DI\create(\Neomerx\Cors\Strategies\Settings::class)
@ -57,7 +58,7 @@ final class RegisterDependencies
\DI\get('pdo.dsn'), \DI\get('pdo.dsn'),
\DI\get('pdo.username'), \DI\get('pdo.username'),
\DI\get('pdo.password'), \DI\get('pdo.password'),
\DI\get('pdo.options', null) \DI\get('pdo.options')
), ),
// DataMocker // DataMocker
@ -68,6 +69,33 @@ final class RegisterDependencies
\OpenAPIServer\Mock\OpenApiDataMockerRouteMiddlewareFactory::class => \DI\autowire() \OpenAPIServer\Mock\OpenApiDataMockerRouteMiddlewareFactory::class => \DI\autowire()
->constructorParameter('getMockStatusCodeCallback', \DI\get('mocker.getMockStatusCodeCallback')) ->constructorParameter('getMockStatusCodeCallback', \DI\get('mocker.getMockStatusCodeCallback'))
->constructorParameter('afterCallback', \DI\get('mocker.afterCallback')), ->constructorParameter('afterCallback', \DI\get('mocker.afterCallback')),
// Monolog Logger
\Psr\Log\LoggerInterface::class => \DI\factory(function (string $mode, string $name, string $path, $level, array $options = []) {
$logger = new \Monolog\Logger($name);
$handlers = [];
// stream logger as default handler across all environments
// somebody might not need it during development
$handlers[] = new \Monolog\Handler\StreamHandler($path, $level);
if ($mode === 'development') {
// add dev handlers if necessary
// @see https://github.com/Seldaek/monolog/blob/f2f66cd480df5f165391ff9b6332700d467b25ac/doc/02-handlers-formatters-processors.md#logging-in-development
} elseif ($mode === 'production') {
// add prod handlers
// @see https://github.com/Seldaek/monolog/blob/f2f66cd480df5f165391ff9b6332700d467b25ac/doc/02-handlers-formatters-processors.md#send-alerts-and-emails
// handlers which doesn't make sense during development
// Slack, Sentry, Swift or native mailer
}
return $logger->setHandlers($handlers);
})
->parameter('mode', \DI\get('mode'))
->parameter('name', \DI\get('logger.name'))
->parameter('path', \DI\get('logger.path'))
->parameter('level', \DI\get('logger.level'))
->parameter('options', \DI\get('logger.options')),
]); ]);
} }
} }

View File

@ -22,3 +22,7 @@ composer.phar
!/config/.htaccess !/config/.htaccess
!/config/dev/default.inc.php !/config/dev/default.inc.php
!/config/prod/default.inc.php !/config/prod/default.inc.php
# Logs folder
/logs/**/*.*
!/logs/.htaccess

View File

@ -20,6 +20,7 @@ lib/Model/Order.php
lib/Model/Pet.php lib/Model/Pet.php
lib/Model/Tag.php lib/Model/Tag.php
lib/Model/User.php lib/Model/User.php
logs/.htaccess
phpcs.xml.dist phpcs.xml.dist
phpunit.xml.dist phpunit.xml.dist
public/.htaccess public/.htaccess

View File

@ -114,6 +114,11 @@ Used packages:
* [Openapi Data Mocker Server Middleware](https://github.com/ybelenko/openapi-data-mocker-server-middleware) - PSR-15 HTTP server middleware. * [Openapi Data Mocker Server Middleware](https://github.com/ybelenko/openapi-data-mocker-server-middleware) - PSR-15 HTTP server middleware.
* [Openapi Data Mocker Interfaces](https://github.com/ybelenko/openapi-data-mocker-interfaces) - package with mocking interfaces. * [Openapi Data Mocker Interfaces](https://github.com/ybelenko/openapi-data-mocker-interfaces) - package with mocking interfaces.
## Logging
Build contains pre-configured [`monolog/monolog`](https://github.com/Seldaek/monolog) package. Make sure that `logs` folder is writable.
Add required log handlers/processors/formatters in `lib/App/RegisterDependencies.php`.
## API Endpoints ## API Endpoints
All URIs are relative to *http://petstore.swagger.io/v2* All URIs are relative to *http://petstore.swagger.io/v2*

View File

@ -10,6 +10,7 @@
"require": { "require": {
"php": "^7.4 || ^8.0", "php": "^7.4 || ^8.0",
"dyorg/slim-token-authentication": "dev-slim4", "dyorg/slim-token-authentication": "dev-slim4",
"monolog/monolog": "^2.4",
"neomerx/cors-psr7": "^2.0", "neomerx/cors-psr7": "^2.0",
"php-di/slim-bridge": "^3.2", "php-di/slim-bridge": "^3.2",
"slim/psr7": "^1.1.0", "slim/psr7": "^1.1.0",

View File

@ -95,4 +95,10 @@ return [
return $response->withHeader('X-OpenAPIServer-Mock', 'pong'); return $response->withHeader('X-OpenAPIServer-Mock', 'pong');
}; };
}, },
// logger
'logger.name' => 'App',
'logger.path' => \realpath(__DIR__ . '/../../logs') . '/app.log',
'logger.level' => 100, // equals DEBUG level
'logger.options' => [],
]; ];

View File

@ -62,4 +62,10 @@ return [
'pdo.options' => [ 'pdo.options' => [
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
], ],
// logger
'logger.name' => 'App',
'logger.path' => \realpath(__DIR__ . '/../../logs') . '/app.log',
'logger.level' => 300, // equals WARNING level
'logger.options' => [],
]; ];

View File

@ -54,9 +54,10 @@ final class RegisterDependencies
// Slim error middleware // Slim error middleware
// @see https://www.slimframework.com/docs/v4/middleware/error-handling.html // @see https://www.slimframework.com/docs/v4/middleware/error-handling.html
\Slim\Middleware\ErrorMiddleware::class => \DI\autowire() \Slim\Middleware\ErrorMiddleware::class => \DI\autowire()
->constructorParameter('displayErrorDetails', \DI\get('slim.displayErrorDetails', false)) ->constructorParameter('displayErrorDetails', \DI\get('slim.displayErrorDetails'))
->constructorParameter('logErrors', \DI\get('slim.logErrors', true)) ->constructorParameter('logErrors', \DI\get('slim.logErrors'))
->constructorParameter('logErrorDetails', \DI\get('slim.logErrorDetails', true)), ->constructorParameter('logErrorDetails', \DI\get('slim.logErrorDetails'))
->constructorParameter('logger', \DI\get(\Psr\Log\LoggerInterface::class)),
// CORS // CORS
\Neomerx\Cors\Contracts\AnalysisStrategyInterface::class => \DI\create(\Neomerx\Cors\Strategies\Settings::class) \Neomerx\Cors\Contracts\AnalysisStrategyInterface::class => \DI\create(\Neomerx\Cors\Strategies\Settings::class)
@ -70,7 +71,7 @@ final class RegisterDependencies
\DI\get('pdo.dsn'), \DI\get('pdo.dsn'),
\DI\get('pdo.username'), \DI\get('pdo.username'),
\DI\get('pdo.password'), \DI\get('pdo.password'),
\DI\get('pdo.options', null) \DI\get('pdo.options')
), ),
// DataMocker // DataMocker
@ -81,6 +82,33 @@ final class RegisterDependencies
\OpenAPIServer\Mock\OpenApiDataMockerRouteMiddlewareFactory::class => \DI\autowire() \OpenAPIServer\Mock\OpenApiDataMockerRouteMiddlewareFactory::class => \DI\autowire()
->constructorParameter('getMockStatusCodeCallback', \DI\get('mocker.getMockStatusCodeCallback')) ->constructorParameter('getMockStatusCodeCallback', \DI\get('mocker.getMockStatusCodeCallback'))
->constructorParameter('afterCallback', \DI\get('mocker.afterCallback')), ->constructorParameter('afterCallback', \DI\get('mocker.afterCallback')),
// Monolog Logger
\Psr\Log\LoggerInterface::class => \DI\factory(function (string $mode, string $name, string $path, $level, array $options = []) {
$logger = new \Monolog\Logger($name);
$handlers = [];
// stream logger as default handler across all environments
// somebody might not need it during development
$handlers[] = new \Monolog\Handler\StreamHandler($path, $level);
if ($mode === 'development') {
// add dev handlers if necessary
// @see https://github.com/Seldaek/monolog/blob/f2f66cd480df5f165391ff9b6332700d467b25ac/doc/02-handlers-formatters-processors.md#logging-in-development
} elseif ($mode === 'production') {
// add prod handlers
// @see https://github.com/Seldaek/monolog/blob/f2f66cd480df5f165391ff9b6332700d467b25ac/doc/02-handlers-formatters-processors.md#send-alerts-and-emails
// handlers which doesn't make sense during development
// Slack, Sentry, Swift or native mailer
}
return $logger->setHandlers($handlers);
})
->parameter('mode', \DI\get('mode'))
->parameter('name', \DI\get('logger.name'))
->parameter('path', \DI\get('logger.path'))
->parameter('level', \DI\get('logger.level'))
->parameter('options', \DI\get('logger.options')),
]); ]);
} }
} }

View File

@ -0,0 +1 @@
Deny from all

View File

@ -8,6 +8,9 @@
<!-- Don't need to inspect installed packages --> <!-- Don't need to inspect installed packages -->
<exclude-pattern>./vendor</exclude-pattern> <exclude-pattern>./vendor</exclude-pattern>
<!-- Don't need to scan logs -->
<exclude-pattern>./logs</exclude-pattern>
<!-- <basepath> A path to strip from the front of file paths inside reports --> <!-- <basepath> A path to strip from the front of file paths inside reports -->
<arg name="basepath" value="."/> <arg name="basepath" value="."/>