Log DB
This commit is contained in:
60
app/common/Implement/Log/MySQLHandler.php
Normal file
60
app/common/Implement/Log/MySQLHandler.php
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
<?php
|
||||||
|
namespace Incoviba\Common\Implement\Log;
|
||||||
|
|
||||||
|
use PDOStatement;
|
||||||
|
use Monolog\Handler\AbstractProcessingHandler;
|
||||||
|
use Monolog\LogRecord;
|
||||||
|
use Monolog\Level;
|
||||||
|
use Incoviba\Common\Define\Connection;
|
||||||
|
|
||||||
|
class MySQLHandler extends AbstractProcessingHandler
|
||||||
|
{
|
||||||
|
private bool $initialized = false;
|
||||||
|
private PDOStatement $statement;
|
||||||
|
|
||||||
|
public function __construct(protected Connection $connection, int|string|Level $level = Level::Debug, bool $bubble = true)
|
||||||
|
{
|
||||||
|
parent::__construct($level, $bubble);
|
||||||
|
}
|
||||||
|
public function write(LogRecord $record): void
|
||||||
|
{
|
||||||
|
if (!$this->initialized) {
|
||||||
|
$this->initialized();
|
||||||
|
}
|
||||||
|
$this->cleanup();
|
||||||
|
$this->statement->execute([
|
||||||
|
'channel' => $record->channel,
|
||||||
|
'level' => $record->level->getName(),
|
||||||
|
'message' => $record->formatted,
|
||||||
|
'time' => $record->datetime->format('Y-m-d H:i:s.u'),
|
||||||
|
'context' => (count($record->context) > 0) ? json_encode($record->context, JSON_UNESCAPED_SLASHES) : '',
|
||||||
|
'extra' => (count($record->extra) > 0) ? json_encode($record->extra, JSON_UNESCAPED_SLASHES) : ''
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function initialized(): void
|
||||||
|
{
|
||||||
|
$query = <<<QUERY
|
||||||
|
CREATE TABLE IF NOT EXISTS monolog (
|
||||||
|
channel VARCHAR(255),
|
||||||
|
level VARCHAR(100),
|
||||||
|
message LONGTEXT,
|
||||||
|
time DATETIME,
|
||||||
|
context LONGTEXT,
|
||||||
|
extra LONGTEXT
|
||||||
|
)
|
||||||
|
QUERY;
|
||||||
|
$this->connection->getPDO()->exec($query);
|
||||||
|
$query = <<<QUERY
|
||||||
|
INSERT INTO monolog (channel, level, message, time, context, extra)
|
||||||
|
VALUES (:channel, :level, :message, :time, :context, :extra)
|
||||||
|
QUERY;
|
||||||
|
$this->statement = $this->connection->getPDO()->prepare($query);
|
||||||
|
$this->initialized = true;
|
||||||
|
}
|
||||||
|
private function cleanup(): void
|
||||||
|
{
|
||||||
|
$query = "DELETE FROM monolog WHERE time < DATE_SUB(CURDATE(), INTERVAL 90 DAY)";
|
||||||
|
$this->connection->query($query);
|
||||||
|
}
|
||||||
|
}
|
19
app/common/Implement/Log/PDOFormatter.php
Normal file
19
app/common/Implement/Log/PDOFormatter.php
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
namespace Incoviba\Common\Implement\Log;
|
||||||
|
|
||||||
|
use Monolog\Formatter\JsonFormatter;
|
||||||
|
use Monolog\LogRecord;
|
||||||
|
|
||||||
|
class PDOFormatter extends JsonFormatter
|
||||||
|
{
|
||||||
|
public function __construct(int $batchMode = self::BATCH_MODE_JSON, bool $appendNewline = false, bool $ignoreEmptyContextAndExtra = false, bool $includeStacktraces = true)
|
||||||
|
{
|
||||||
|
parent::__construct($batchMode, $appendNewline, $ignoreEmptyContextAndExtra, $includeStacktraces);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function format(LogRecord $record): string
|
||||||
|
{
|
||||||
|
$normalized = $this->normalize($record);
|
||||||
|
return $normalized['message'];
|
||||||
|
}
|
||||||
|
}
|
@ -4,18 +4,6 @@ use Psr\Container\ContainerInterface;
|
|||||||
return [
|
return [
|
||||||
Psr\Log\LoggerInterface::class => function(ContainerInterface $container) {
|
Psr\Log\LoggerInterface::class => function(ContainerInterface $container) {
|
||||||
return new Monolog\Logger('incoviba', [
|
return new Monolog\Logger('incoviba', [
|
||||||
new Monolog\Handler\FilterHandler(
|
|
||||||
(new Monolog\Handler\RotatingFileHandler('/logs/debug.log', 10))
|
|
||||||
->setFormatter(new Monolog\Formatter\LineFormatter(null, null, false, false, true)),
|
|
||||||
Monolog\Level::Debug,
|
|
||||||
Monolog\Level::Debug
|
|
||||||
),
|
|
||||||
new Monolog\Handler\FilterHandler(
|
|
||||||
(new Monolog\Handler\RotatingFileHandler('/logs/info.log', 10))
|
|
||||||
->setFormatter(new Monolog\Formatter\LineFormatter(null, null, false, false, true)),
|
|
||||||
Monolog\Level::Info,
|
|
||||||
Monolog\Level::Warning,
|
|
||||||
),
|
|
||||||
new Monolog\Handler\FilterHandler(
|
new Monolog\Handler\FilterHandler(
|
||||||
(new Monolog\Handler\RotatingFileHandler('/logs/error.log', 10))
|
(new Monolog\Handler\RotatingFileHandler('/logs/error.log', 10))
|
||||||
->setFormatter(new Monolog\Formatter\LineFormatter(null, null, false, false, true)),
|
->setFormatter(new Monolog\Formatter\LineFormatter(null, null, false, false, true)),
|
||||||
@ -26,6 +14,17 @@ return [
|
|||||||
(new Monolog\Handler\RotatingFileHandler('/logs/critical.log', 10))
|
(new Monolog\Handler\RotatingFileHandler('/logs/critical.log', 10))
|
||||||
->setFormatter(new Monolog\Formatter\LineFormatter(null, null, false, false, true)),
|
->setFormatter(new Monolog\Formatter\LineFormatter(null, null, false, false, true)),
|
||||||
Monolog\Level::Critical
|
Monolog\Level::Critical
|
||||||
|
),
|
||||||
|
new Monolog\Handler\FilterHandler(
|
||||||
|
new Monolog\Handler\RedisHandler($container->get(Predis\ClientInterface::class), 'logs:notices'),
|
||||||
|
Monolog\Level::Notice,
|
||||||
|
Monolog\Level::Warning
|
||||||
|
),
|
||||||
|
new Monolog\Handler\FilterHandler(
|
||||||
|
(new Incoviba\Common\Implement\Log\MySQLHandler($container->get(Incoviba\Common\Define\Connection::class)))
|
||||||
|
->setFormatter(new Incoviba\Common\Implement\Log\PDOFormatter()),
|
||||||
|
Monolog\Level::Debug,
|
||||||
|
Monolog\Level::Warning
|
||||||
)
|
)
|
||||||
], [
|
], [
|
||||||
$container->get(Monolog\Processor\PsrLogMessageProcessor::class),
|
$container->get(Monolog\Processor\PsrLogMessageProcessor::class),
|
||||||
|
@ -26,40 +26,40 @@ return [
|
|||||||
->register('usd', $mindicador)
|
->register('usd', $mindicador)
|
||||||
->register('ipc', $ine);
|
->register('ipc', $ine);
|
||||||
},
|
},
|
||||||
Predis\Client::class => function(ContainerInterface $container) {
|
Predis\ClientInterface::class => function(ContainerInterface $container) {
|
||||||
return new Predis\Client([
|
return new Predis\Client([
|
||||||
'scheme' => 'tcp',
|
'scheme' => 'tcp',
|
||||||
'host' => $container->get('REDIS_HOST'),
|
'host' => $container->get('REDIS_HOST'),
|
||||||
'port' => $container->get('REDIS_PORT')
|
'port' => $container->get('REDIS_PORT')
|
||||||
]);
|
]);
|
||||||
},
|
},
|
||||||
\Incoviba\Service\Contabilidad\Cartola::class => function(ContainerInterface $container) {
|
Incoviba\Service\Contabilidad\Cartola::class => function(ContainerInterface $container) {
|
||||||
return (new \Incoviba\Service\Contabilidad\Cartola(
|
return (new Incoviba\Service\Contabilidad\Cartola(
|
||||||
$container->get(Psr\Log\LoggerInterface::class),
|
$container->get(Psr\Log\LoggerInterface::class),
|
||||||
$container->get(Psr\Http\Message\StreamFactoryInterface::class),
|
$container->get(Psr\Http\Message\StreamFactoryInterface::class),
|
||||||
$container->get(Incoviba\Common\Define\Contabilidad\Exporter::class),
|
$container->get(Incoviba\Common\Define\Contabilidad\Exporter::class),
|
||||||
$container->get(Incoviba\Repository\Inmobiliaria::class),
|
$container->get(Incoviba\Repository\Inmobiliaria::class),
|
||||||
$container->get(Incoviba\Repository\Inmobiliaria\Cuenta::class),
|
$container->get(Incoviba\Repository\Inmobiliaria\Cuenta::class),
|
||||||
$container->get(\Incoviba\Repository\Contabilidad\Movimiento::class),
|
$container->get(Incoviba\Repository\Contabilidad\Movimiento::class),
|
||||||
$container->get(\Incoviba\Service\Contabilidad\Movimiento::class),
|
$container->get(Incoviba\Service\Contabilidad\Movimiento::class),
|
||||||
$container->get(\Incoviba\Repository\Contabilidad\Cartola::class)
|
$container->get(Incoviba\Repository\Contabilidad\Cartola::class)
|
||||||
))
|
))
|
||||||
->register('security', $container->get(\Incoviba\Service\Contabilidad\Cartola\Security::class))
|
->register('security', $container->get(Incoviba\Service\Contabilidad\Cartola\Security::class))
|
||||||
->register('itau', $container->get(\Incoviba\Service\Contabilidad\Cartola\Itau::class))
|
->register('itau', $container->get(Incoviba\Service\Contabilidad\Cartola\Itau::class))
|
||||||
->register('santander', $container->get(\Incoviba\Service\Contabilidad\Cartola\Santander::class))
|
->register('santander', $container->get(Incoviba\Service\Contabilidad\Cartola\Santander::class))
|
||||||
->register('bci', $container->get(\Incoviba\Service\Contabilidad\Cartola\BCI::class));
|
->register('bci', $container->get(Incoviba\Service\Contabilidad\Cartola\BCI::class));
|
||||||
},
|
},
|
||||||
Incoviba\Common\Define\Contabilidad\Exporter::class => function(ContainerInterface $container) {
|
Incoviba\Common\Define\Contabilidad\Exporter::class => function(ContainerInterface $container) {
|
||||||
return $container->get(Incoviba\Service\Contabilidad\Exporter\Nubox::class);
|
return $container->get(Incoviba\Service\Contabilidad\Exporter\Nubox::class);
|
||||||
},
|
},
|
||||||
Incoviba\Service\Contabilidad\Exporter\Nubox::class => function(ContainerInterface $container) {
|
Incoviba\Service\Contabilidad\Exporter\Nubox::class => function(ContainerInterface $container) {
|
||||||
return new Incoviba\Service\Contabilidad\Exporter\Nubox($container->get(\Incoviba\Repository\Contabilidad\CentroCosto::class),
|
return new Incoviba\Service\Contabilidad\Exporter\Nubox($container->get(Incoviba\Repository\Contabilidad\CentroCosto::class),
|
||||||
$container->get('folders')->get('uploads'));
|
$container->get('folders')->get('uploads'));
|
||||||
},
|
},
|
||||||
Incoviba\Service\Contabilidad\Nubox::class => function(ContainerInterface $container) {
|
Incoviba\Service\Contabilidad\Nubox::class => function(ContainerInterface $container) {
|
||||||
return new Incoviba\Service\Contabilidad\Nubox(
|
return new Incoviba\Service\Contabilidad\Nubox(
|
||||||
$container->get(Psr\Log\LoggerInterface::class),
|
$container->get(Psr\Log\LoggerInterface::class),
|
||||||
$container->get(\Incoviba\Repository\Contabilidad\Nubox::class),
|
$container->get(Incoviba\Repository\Contabilidad\Nubox::class),
|
||||||
$container->get(Incoviba\Service\Redis::class),
|
$container->get(Incoviba\Service\Redis::class),
|
||||||
new GuzzleHttp\Client(),
|
new GuzzleHttp\Client(),
|
||||||
$container->get(Psr\Http\Message\RequestFactoryInterface::class),
|
$container->get(Psr\Http\Message\RequestFactoryInterface::class),
|
||||||
|
@ -18,7 +18,7 @@ class Errors
|
|||||||
try {
|
try {
|
||||||
return $handler->handle($request);
|
return $handler->handle($request);
|
||||||
} catch (Exception $exception) {
|
} catch (Exception $exception) {
|
||||||
$this->logger->notice($exception);
|
$this->logger->warning($exception);
|
||||||
} catch (Error $error) {
|
} catch (Error $error) {
|
||||||
$this->logger->error($error);
|
$this->logger->error($error);
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace Incoviba\Service;
|
namespace Incoviba\Service;
|
||||||
|
|
||||||
use Predis\Client;
|
use Predis\ClientInterface;
|
||||||
use Incoviba\Common\Implement\Exception\EmptyRedis;
|
use Incoviba\Common\Implement\Exception\EmptyRedis;
|
||||||
|
|
||||||
class Redis
|
class Redis
|
||||||
{
|
{
|
||||||
public function __construct(protected Client $client) {}
|
public function __construct(protected ClientInterface $client) {}
|
||||||
|
|
||||||
public function get(string $name): mixed
|
public function get(string $name): mixed
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user