/logging/processors.rst
ReStructuredText | 248 lines | 190 code | 58 blank | 0 comment | 0 complexity | 4200d7df281c32ad927a0bd99346ccae MD5 | raw file
Possible License(s): ISC, MPL-2.0-no-copyleft-exception
- How to Add extra Data to Log Messages via a Processor
- =====================================================
- Monolog allows you to process the record before logging it to add some
- extra data. A processor can be applied for the whole handler stack or
- only for a specific handler.
- A processor is a callable receiving the record as its first argument.
- Processors are configured using the ``monolog.processor`` DIC tag. See the
- :ref:`reference about it <dic_tags-monolog-processor>`.
- Adding a Session/Request Token
- ------------------------------
- Sometimes it is hard to tell which entries in the log belong to which session
- and/or request. The following example will add a unique token for each request
- using a processor::
- namespace App\Logger;
- use Symfony\Component\HttpFoundation\Session\SessionInterface;
- class SessionRequestProcessor
- {
- private $session;
- private $sessionId;
- public function __construct(SessionInterface $session)
- {
- $this->session = $session;
- }
- public function __invoke(array $record)
- {
- if (!$this->session->isStarted()) {
- return $record;
- }
- if (!$this->sessionId) {
- $this->sessionId = substr($this->session->getId(), 0, 8) ?: '????????';
- }
- $record['extra']['token'] = $this->sessionId.'-'.substr(uniqid('', true), -8);
- return $record;
- }
- }
- Next, register your class as a service, as well as a formatter that uses the extra
- information:
- .. configuration-block::
- .. code-block:: yaml
- # config/services.yaml
- services:
- monolog.formatter.session_request:
- class: Monolog\Formatter\LineFormatter
- arguments:
- - "[%%datetime%%] [%%extra.token%%] %%channel%%.%%level_name%%: %%message%% %%context%% %%extra%%\n"
- App\Logger\SessionRequestProcessor:
- tags:
- - { name: monolog.processor }
- .. code-block:: xml
- <!-- config/services.xml -->
- <?xml version="1.0" encoding="UTF-8" ?>
- <container xmlns="http://symfony.com/schema/dic/services"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:monolog="http://symfony.com/schema/dic/monolog"
- xsi:schemaLocation="http://symfony.com/schema/dic/services
- https://symfony.com/schema/dic/services/services-1.0.xsd
- http://symfony.com/schema/dic/monolog
- https://symfony.com/schema/dic/monolog/monolog-1.0.xsd">
- <services>
- <service id="monolog.formatter.session_request"
- class="Monolog\Formatter\LineFormatter">
- <argument>[%%datetime%%] [%%extra.token%%] %%channel%%.%%level_name%%: %%message%% %%context%% %%extra%%
</argument>
- </service>
- <service id="App\Logger\SessionRequestProcessor">
- <tag name="monolog.processor"/>
- </service>
- </services>
- </container>
- .. code-block:: php
- // config/services.php
- use App\Logger\SessionRequestProcessor;
- use Monolog\Formatter\LineFormatter;
- $container
- ->register('monolog.formatter.session_request', LineFormatter::class)
- ->addArgument('[%%datetime%%] [%%extra.token%%] %%channel%%.%%level_name%%: %%message%% %%context%% %%extra%%\n');
- $container
- ->register(SessionRequestProcessor::class)
- ->addTag('monolog.processor', ['method' => 'processRecord']);
- Finally, set the formatter to be used on whatever handler you want:
- .. configuration-block::
- .. code-block:: yaml
- # config/packages/prod/monolog.yaml
- monolog:
- handlers:
- main:
- type: stream
- path: '%kernel.logs_dir%/%kernel.environment%.log'
- level: debug
- formatter: monolog.formatter.session_request
- .. code-block:: xml
- <!-- config/packages/prod/monolog.xml -->
- <?xml version="1.0" encoding="UTF-8" ?>
- <container xmlns="http://symfony.com/schema/dic/services"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:monolog="http://symfony.com/schema/dic/monolog"
- xsi:schemaLocation="http://symfony.com/schema/dic/services
- https://symfony.com/schema/dic/services/services-1.0.xsd
- http://symfony.com/schema/dic/monolog
- https://symfony.com/schema/dic/monolog/monolog-1.0.xsd">
- <monolog:config>
- <monolog:handler
- name="main"
- type="stream"
- path="%kernel.logs_dir%/%kernel.environment%.log"
- level="debug"
- formatter="monolog.formatter.session_request"
- />
- </monolog:config>
- </container>
- .. code-block:: php
- // config/packages/prod/monolog.php
- $container->loadFromExtension('monolog', [
- 'handlers' => [
- 'main' => [
- 'type' => 'stream',
- 'path' => '%kernel.logs_dir%/%kernel.environment%.log',
- 'level' => 'debug',
- 'formatter' => 'monolog.formatter.session_request',
- ],
- ],
- ]);
- If you use several handlers, you can also register a processor at the
- handler level or at the channel level instead of registering it globally
- (see the following sections).
- Registering Processors per Handler
- ----------------------------------
- You can register a processor per handler using the ``handler`` option of
- the ``monolog.processor`` tag:
- .. configuration-block::
- .. code-block:: yaml
- # config/services.yaml
- services:
- App\Logger\SessionRequestProcessor:
- tags:
- - { name: monolog.processor, handler: main }
- .. code-block:: xml
- <!-- config/services.xml -->
- <?xml version="1.0" encoding="UTF-8" ?>
- <container xmlns="http://symfony.com/schema/dic/services"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:monolog="http://symfony.com/schema/dic/monolog"
- xsi:schemaLocation="http://symfony.com/schema/dic/services
- https://symfony.com/schema/dic/services/services-1.0.xsd
- http://symfony.com/schema/dic/monolog
- https://symfony.com/schema/dic/monolog/monolog-1.0.xsd">
- <services>
- <service id="App\Logger\SessionRequestProcessor">
- <tag name="monolog.processor" handler="main"/>
- </service>
- </services>
- </container>
- .. code-block:: php
- // config/services.php
- // ...
- $container
- ->register(SessionRequestProcessor::class)
- ->addTag('monolog.processor', ['handler' => 'main']);
- Registering Processors per Channel
- ----------------------------------
- You can register a processor per channel using the ``channel`` option of
- the ``monolog.processor`` tag:
- .. configuration-block::
- .. code-block:: yaml
- # config/services.yaml
- services:
- App\Logger\SessionRequestProcessor:
- tags:
- - { name: monolog.processor, channel: main }
- .. code-block:: xml
- <!-- config/services.xml -->
- <?xml version="1.0" encoding="UTF-8" ?>
- <container xmlns="http://symfony.com/schema/dic/services"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:monolog="http://symfony.com/schema/dic/monolog"
- xsi:schemaLocation="http://symfony.com/schema/dic/services
- https://symfony.com/schema/dic/services/services-1.0.xsd
- http://symfony.com/schema/dic/monolog
- https://symfony.com/schema/dic/monolog/monolog-1.0.xsd">
- <services>
- <service id="App\Logger\SessionRequestProcessor">
- <tag name="monolog.processor" channel="main"/>
- </service>
- </services>
- </container>
- .. code-block:: php
- // config/services.php
- // ...
- $container
- ->register(SessionRequestProcessor::class)
- ->addTag('monolog.processor', ['channel' => 'main']);