Skip to content

Commit 5ed246e

Browse files
committed
EventLogLogger. Логгер в журнал событий.
1 parent 906cff5 commit 5ed246e

File tree

5 files changed

+130
-2
lines changed

5 files changed

+130
-2
lines changed

DependencyInjection/BitrixOrdinaryToolsExtension.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public function load(array $configs, ContainerBuilder $container) : void
3333
$loader->load('services.yaml');
3434
$loader->load('seo.yaml');
3535
$loader->load('image_resizer.yaml');
36+
$loader->load('loggers.yaml');
3637

3738
if (!class_exists('Prokl\CustomFrameworkExtensionsBundle\DependencyInjection\CustomFrameworkExtensionsExtension')) {
3839
throw new LogicException(

Resources/config/loggers.yaml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
###########
2+
# Логгеры
3+
###########
4+
5+
services:
6+
# конфигурация по умолчанию в *этом* файле
7+
_defaults:
8+
autowire: true
9+
autoconfigure: true
10+
public: true
11+
12+
bitrix_ordinary_tools.logger_event_table:
13+
class: Prokl\BitrixOrdinaryToolsBundle\Services\Logger\EventLogLogger
14+
tags:
15+
- { name: monolog.logger }
16+
17+
Prokl\BitrixOrdinaryToolsBundle\Services\Logger\EventLogLogger: '@bitrix_ordinary_tools.logger_event_table'

Services/Logger/EventLogLogger.php

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
<?php
2+
3+
namespace Prokl\BitrixOrdinaryToolsBundle\Services\Logger;
4+
5+
use Bitrix\Main\Application;
6+
use Bitrix\Main\EventLog\Internal\EventLogTable;
7+
use Bitrix\Main\Type\DateTime;
8+
use Monolog\Handler\AbstractProcessingHandler;
9+
use Monolog\Logger;
10+
11+
/**
12+
* Class EventLogLogger
13+
* Записывает логи в журнал событий /bitrix/admin/event_log.php?lang=ru.
14+
* @package Prokl\BitrixOrdinaryToolsBundle\Services\Logger
15+
*/
16+
class EventLogLogger extends AbstractProcessingHandler
17+
{
18+
/**
19+
* @var string
20+
*/
21+
private $defaultModuleId;
22+
23+
/**
24+
* @inheritdoc
25+
*/
26+
public function __construct($level = Logger::DEBUG, string $moduleId = '')
27+
{
28+
parent::__construct($level);
29+
30+
$this->defaultModuleId = $moduleId;
31+
}
32+
33+
/**
34+
* @inheritdoc
35+
*/
36+
protected function write(array $record): void
37+
{
38+
global $USER;
39+
$appContext = Application::getInstance()->getContext();
40+
$server = $appContext->getServer();
41+
42+
/** @var \DateTime $datetime */
43+
$datetime = $record['datetime'];
44+
45+
EventLogTable::add([
46+
'TIMESTAMP_X' => DateTime::createFromTimestamp($datetime->getTimestamp()),
47+
'SEVERITY' => $record['level_name'],
48+
'MODULE_ID' => $record['context']['MODULE_ID'] ?? $this->defaultModuleId,
49+
'AUDIT_TYPE_ID' => $record['level_name'],
50+
'ITEM_ID' => $record['context']['ITEM_ID'] ?? '',
51+
'REMOTE_ADDR' => $record['context']['REMOTE_ADDR'] ?? $server->getRemoteAddr(),
52+
'USER_AGENT' => $record['context']['USER_AGENT'] ?? $server->getUserAgent(),
53+
'REQUEST_URI' => $record['context']['REQUEST_URI'] ?? $server->getRequestUri(),
54+
'SITE_ID' => $record['context']['SITE_ID'] ?? $appContext->getSite(),
55+
'USER_ID' => $record['context']['USER_ID'] ?? $USER->GetID(),
56+
'GUEST_ID' => $record['context']['GUEST_ID'] ?? '',
57+
'DESCRIPTION' => $this->interpolate($record['formatted'], (array)$record['context']),
58+
]);
59+
}
60+
61+
/**
62+
* @param string $message
63+
* @param array $context
64+
*
65+
* @return string
66+
*/
67+
public function interpolate(string $message, array $context = []): string
68+
{
69+
// build a replacement array with braces around the context keys
70+
$replace = [];
71+
foreach ($context as $key => $val) {
72+
// check that the value can be cast to string
73+
if (!is_array($val) && (!is_object($val) || method_exists($val, '__toString'))) {
74+
$replace['{' . $key . '}'] = $val;
75+
}
76+
}
77+
78+
// interpolate replacement values into the message and return
79+
return strtr($message, $replace);
80+
}
81+
}

composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@
2525
"symfony/http-kernel": "^4.0 || ^5.0",
2626
"symfony/config": "~4|~5",
2727
"intervention/image": "^2.5",
28-
"twig/twig": "~1.0 | ~2.0"
28+
"twig/twig": "~1.0 | ~2.0",
29+
"monolog/monolog": "~1.22 || ~2.0"
2930
},
3031
"require-dev": {
3132
"proklung/bitrix-phpunit-testing-tools": "^1.0"

readme.MD

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,32 @@ composer require proklung/bitrix-tools-pack-bundle
4242
- `Prokl\BitrixOrdinaryToolsBundle\Services\Facades\CUser` - `CUser`
4343
- `Prokl\BitrixOrdinaryToolsBundle\Services\Facades\CUser` - `CFile`
4444
- `Prokl\BitrixOrdinaryToolsBundle\Services\Facades\EventManager` - `Bitrix\Main\EventManager`
45-
- `Prokl\BitrixOrdinaryToolsBundle\Services\Facades\EventMail` - `Bitrix\Main\Mail\Event`
45+
- `Prokl\BitrixOrdinaryToolsBundle\Services\Facades\EventMail` - `Bitrix\Main\Mail\Event`
46+
47+
## Логгеры
48+
49+
- `Prokl\BitrixOrdinaryToolsBundle\Services\Logger\EventLogLogger` - monolog-логгер для записи логов
50+
в журнал событий /bitrix/admin/event_log.php?lang=ru.
51+
52+
Конфигурация Monolog Bundle:
53+
54+
```yaml
55+
monolog:
56+
handlers:
57+
myHandler:
58+
type: service
59+
id: Prokl\BitrixOrdinaryToolsBundle\Services\Logger\EventLogLogger
60+
level: error
61+
```
62+
63+
Использование:
64+
65+
```php
66+
use Monolog\Logger;
67+
/** @var Logger $logger */
68+
$logger = container()->get('public_logger');
69+
$logger->error(
70+
'Testing',
71+
['context' => 'OK', 'MODULE_ID' => 'My module', 'ITEM_ID' => get_class($this)]
72+
);
73+
```

0 commit comments

Comments
 (0)