From 37d30d2aec751035e691c56e8b82f123235662cd Mon Sep 17 00:00:00 2001 From: Juan Pablo Vial Date: Tue, 3 Jun 2025 21:09:13 -0400 Subject: [PATCH] Cleanup logs --- app/setup/settings/time.php | 8 ++ app/setup/setups/logs.php | 173 ++++++++++++++++++++++-------------- 2 files changed, 112 insertions(+), 69 deletions(-) create mode 100644 app/setup/settings/time.php diff --git a/app/setup/settings/time.php b/app/setup/settings/time.php new file mode 100644 index 0000000..0ac8b73 --- /dev/null +++ b/app/setup/settings/time.php @@ -0,0 +1,8 @@ + function(ContainerInterface $container) { + return new DateTimeZone($container->get('TZ') ?? 'America/Santiago'); + } +]; diff --git a/app/setup/setups/logs.php b/app/setup/setups/logs.php index 0a94a68..fe838c8 100644 --- a/app/setup/setups/logs.php +++ b/app/setup/setups/logs.php @@ -17,85 +17,120 @@ return [ return (new Monolog\Formatter\LineFormatter(null, null, false, false, true)) ->setBasePath('/code/'); }, - Psr\Log\LoggerInterface::class => function(ContainerInterface $container) { - return new Monolog\Logger('incoviba', [ - new Monolog\Handler\FilterHandler( - ($container->has('ENVIRONMENT') and $container->get('ENVIRONMENT') === 'development') - ? (new Monolog\Handler\StreamHandler('/logs/error.log')) - ->setFormatter($container->get(Monolog\Formatter\LineFormatter::class)) - : (new Monolog\Handler\RotatingFileHandler('/logs/error.log', 10)) - ->setFormatter($container->get(Monolog\Formatter\LineFormatter::class)), - Monolog\Level::Error, - Monolog\Level::Error, - false - ), - new Monolog\Handler\FilterHandler( - ($container->has('ENVIRONMENT') and $container->get('ENVIRONMENT') === 'development') - ? (new Monolog\Handler\StreamHandler('/logs/critical.log')) - ->setFormatter($container->get(Monolog\Formatter\LineFormatter::class)) - : (new Monolog\Handler\RotatingFileHandler('/logs/critical.log', 10)) - ->setFormatter($container->get(Monolog\Formatter\LineFormatter::class)), - Monolog\Level::Critical - ), - new Monolog\Handler\FilterHandler( - ($container->has('ENVIRONMENT') and $container->get('ENVIRONMENT') === 'development') - ? (new Monolog\Handler\StreamHandler('/logs/debug.log')) - ->setFormatter($container->get(Monolog\Formatter\LineFormatter::class)) - : new Monolog\Handler\RedisHandler($container->get(Predis\ClientInterface::class), 'logs:notices'), - Monolog\Level::Debug, - Monolog\Level::Info, - false - ), - new Monolog\Handler\FilterHandler( - ($container->has('ENVIRONMENT') and $container->get('ENVIRONMENT') === 'development') - ? (new Monolog\Handler\StreamHandler('/logs/notices.log')) - ->setFormatter($container->get(Monolog\Formatter\LineFormatter::class)) - : (new Incoviba\Common\Implement\Log\Handler\MySQL($container->get(Incoviba\Common\Define\Connection::class))) - ->setFormatter(new \Incoviba\Common\Implement\Log\Formatter\PDO()), - Monolog\Level::Notice, - Monolog\Level::Warning, - false - ) - ], [ - $container->get(Incoviba\Common\Implement\Log\Processor\User::class), + 'baseMonologProcessors' => function(ContainerInterface $container) { + return [ $container->get(Monolog\Processor\IntrospectionProcessor::class), $container->get(Monolog\Processor\WebProcessor::class), $container->get(Monolog\Processor\MemoryUsageProcessor::class), $container->get(Monolog\Processor\MemoryPeakUsageProcessor::class), $container->get(Monolog\Processor\PsrLogMessageProcessor::class), - ], new DateTimeZone($container->get('TZ') ?? 'America/Santiago')); + $container->get(Monolog\Processor\UidProcessor::class), + ]; + }, + 'defaultMonologHandlers' => function(ContainerInterface $container) { + $baseHandlers = [ + 'critical' => [ + 'handler' => Monolog\Handler\RotatingFileHandler::class, + 'filename' => 'critical.log', + 'levels' => Monolog\Level::Critical + ], + 'error' => [ + 'handler' => Monolog\Handler\RotatingFileHandler::class, + 'filename' => 'error.log', + 'levels' => [Monolog\Level::Error, Monolog\Level::Error], + ], + 'notices' => [ + 'handler' => Incoviba\Common\Implement\Log\Handler\MySQL::class, + 'levels' => [Monolog\Level::Notice, Monolog\Level::Warning] + ], + 'debug' => [ + 'handler' => Monolog\Handler\RedisHandler::class, + 'name' => 'notices', + 'levels' => [Monolog\Level::Debug, Monolog\Level::Info] + ], + ]; + if ($container->has('ENVIRONMENT') and $container->get('ENVIRONMENT') === 'development') { + $baseHandlers['critical']['handler'] = Monolog\Handler\StreamHandler::class; + $baseHandlers['error']['handler'] = Monolog\Handler\StreamHandler::class; + $baseHandlers['notices']['handler'] = Monolog\Handler\StreamHandler::class; + $baseHandlers['notices']['filename'] = 'notices.log'; + $baseHandlers['debug']['handler'] = Monolog\Handler\StreamHandler::class; + $baseHandlers['debug']['filename'] = 'debug.log'; + } + $handlers = []; + foreach ($baseHandlers as $handlerData) { + if (in_array($handlerData['handler'], [ + Monolog\Handler\StreamHandler::class, + Monolog\Handler\RotatingFileHandler::class, + ])) { + $params = [ + "/logs/{$handlerData['filename']}", + ]; + if ($handlerData['handler'] === Monolog\Handler\RotatingFileHandler::class) { + $params []= 10; + } + $handler = new $handlerData['handler'](...$params) + ->setFormatter($container->get(Monolog\Formatter\LineFormatter::class)); + } elseif ($handlerData['handler'] === Incoviba\Common\Implement\Log\Handler\MySQL::class) { + $params = [ + $container->get(Incoviba\Common\Define\Connection::class) + ]; + $handler = new $handlerData['handler'](...$params) + ->setFormatter(new \Incoviba\Common\Implement\Log\Formatter\PDO()); + } elseif ($handlerData['handler'] === Monolog\Handler\RedisHandler::class) { + $params = [ + $container->get(Predis\ClientInterface::class), + $handlerData['name'] + ]; + $handler = new $handlerData['handler'](...$params); + } + $params = [ + $handler, + ]; + if (is_array($handlerData['levels'])) { + $params += $handlerData['levels']; + } else { + $params []= $handlerData['levels']; + $params []= null; + } + $params []= false; + $handlers []= new Monolog\Handler\FilterHandler(...$params); + } + return $handlers; + }, + Psr\Log\LoggerInterface::class => function(ContainerInterface $container) { + return new Monolog\Logger('incoviba', + $container->get('defaultMonologHandlers'), + [$container->get(Incoviba\Common\Implement\Log\Processor\User::class)] + + $container->get('baseMonologProcessors'), + $container->get(DateTimeZone::class) + ); }, 'loginLogger' => function(ContainerInterface $container) { - return new Monolog\Logger('login', [ - new Monolog\Handler\RedisHandler($container->get(Predis\ClientInterface::class), 'logs:login'), - ], [ - $container->get(Monolog\Processor\IntrospectionProcessor::class), - $container->get(Monolog\Processor\WebProcessor::class), - $container->get(Monolog\Processor\MemoryUsageProcessor::class), - $container->get(Monolog\Processor\MemoryPeakUsageProcessor::class), - $container->get(Monolog\Processor\PsrLogMessageProcessor::class), - ]); + return new Monolog\Logger('login', + [ + new Monolog\Handler\RedisHandler($container->get(Predis\ClientInterface::class), 'logs:login'), + ], + $container->get('baseMonologProcessors'), + $container->get(DateTimeZone::class) + ); }, 'accessLogger' => function(ContainerInterface $container) { - return new Monolog\Logger('access', [ - new Monolog\Handler\RedisHandler($container->get(Predis\ClientInterface::class), 'logs:access'), - ], [ - $container->get(Monolog\Processor\IntrospectionProcessor::class), - $container->get(Monolog\Processor\WebProcessor::class), - $container->get(Monolog\Processor\MemoryUsageProcessor::class), - $container->get(Monolog\Processor\MemoryPeakUsageProcessor::class), - $container->get(Monolog\Processor\PsrLogMessageProcessor::class), - ]); + return new Monolog\Logger('access', + [ + new Monolog\Handler\RedisHandler($container->get(Predis\ClientInterface::class), 'logs:access'), + ], + $container->get('baseMonologProcessors'), + $container->get(DateTimeZone::class) + ); }, 'externalLogger' => function(ContainerInterface $container) { - return new Monolog\Logger('external', [ - new Monolog\Handler\RedisHandler($container->get(Predis\ClientInterface::class), 'logs:external'), - ], [ - $container->get(Monolog\Processor\IntrospectionProcessor::class), - $container->get(Monolog\Processor\WebProcessor::class), - $container->get(Monolog\Processor\MemoryUsageProcessor::class), - $container->get(Monolog\Processor\MemoryPeakUsageProcessor::class), - $container->get(Monolog\Processor\PsrLogMessageProcessor::class), - ]); + return new Monolog\Logger('external', + [ + new Monolog\Handler\RedisHandler($container->get(Predis\ClientInterface::class), 'logs:external'), + ], + $container->get('baseMonologProcessors'), + $container->get(DateTimeZone::class) + ); }, ];