PageRenderTime 50ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/logging/processors.rst

https://github.com/hhamon/symfony-docs
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
  1. How to Add extra Data to Log Messages via a Processor
  2. =====================================================
  3. Monolog allows you to process the record before logging it to add some
  4. extra data. A processor can be applied for the whole handler stack or
  5. only for a specific handler.
  6. A processor is a callable receiving the record as its first argument.
  7. Processors are configured using the ``monolog.processor`` DIC tag. See the
  8. :ref:`reference about it <dic_tags-monolog-processor>`.
  9. Adding a Session/Request Token
  10. ------------------------------
  11. Sometimes it is hard to tell which entries in the log belong to which session
  12. and/or request. The following example will add a unique token for each request
  13. using a processor::
  14. namespace App\Logger;
  15. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  16. class SessionRequestProcessor
  17. {
  18. private $session;
  19. private $sessionId;
  20. public function __construct(SessionInterface $session)
  21. {
  22. $this->session = $session;
  23. }
  24. public function __invoke(array $record)
  25. {
  26. if (!$this->session->isStarted()) {
  27. return $record;
  28. }
  29. if (!$this->sessionId) {
  30. $this->sessionId = substr($this->session->getId(), 0, 8) ?: '????????';
  31. }
  32. $record['extra']['token'] = $this->sessionId.'-'.substr(uniqid('', true), -8);
  33. return $record;
  34. }
  35. }
  36. Next, register your class as a service, as well as a formatter that uses the extra
  37. information:
  38. .. configuration-block::
  39. .. code-block:: yaml
  40. # config/services.yaml
  41. services:
  42. monolog.formatter.session_request:
  43. class: Monolog\Formatter\LineFormatter
  44. arguments:
  45. - "[%%datetime%%] [%%extra.token%%] %%channel%%.%%level_name%%: %%message%% %%context%% %%extra%%\n"
  46. App\Logger\SessionRequestProcessor:
  47. tags:
  48. - { name: monolog.processor }
  49. .. code-block:: xml
  50. <!-- config/services.xml -->
  51. <?xml version="1.0" encoding="UTF-8" ?>
  52. <container xmlns="http://symfony.com/schema/dic/services"
  53. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  54. xmlns:monolog="http://symfony.com/schema/dic/monolog"
  55. xsi:schemaLocation="http://symfony.com/schema/dic/services
  56. https://symfony.com/schema/dic/services/services-1.0.xsd
  57. http://symfony.com/schema/dic/monolog
  58. https://symfony.com/schema/dic/monolog/monolog-1.0.xsd">
  59. <services>
  60. <service id="monolog.formatter.session_request"
  61. class="Monolog\Formatter\LineFormatter">
  62. <argument>[%%datetime%%] [%%extra.token%%] %%channel%%.%%level_name%%: %%message%% %%context%% %%extra%%&#xA;</argument>
  63. </service>
  64. <service id="App\Logger\SessionRequestProcessor">
  65. <tag name="monolog.processor"/>
  66. </service>
  67. </services>
  68. </container>
  69. .. code-block:: php
  70. // config/services.php
  71. use App\Logger\SessionRequestProcessor;
  72. use Monolog\Formatter\LineFormatter;
  73. $container
  74. ->register('monolog.formatter.session_request', LineFormatter::class)
  75. ->addArgument('[%%datetime%%] [%%extra.token%%] %%channel%%.%%level_name%%: %%message%% %%context%% %%extra%%\n');
  76. $container
  77. ->register(SessionRequestProcessor::class)
  78. ->addTag('monolog.processor', ['method' => 'processRecord']);
  79. Finally, set the formatter to be used on whatever handler you want:
  80. .. configuration-block::
  81. .. code-block:: yaml
  82. # config/packages/prod/monolog.yaml
  83. monolog:
  84. handlers:
  85. main:
  86. type: stream
  87. path: '%kernel.logs_dir%/%kernel.environment%.log'
  88. level: debug
  89. formatter: monolog.formatter.session_request
  90. .. code-block:: xml
  91. <!-- config/packages/prod/monolog.xml -->
  92. <?xml version="1.0" encoding="UTF-8" ?>
  93. <container xmlns="http://symfony.com/schema/dic/services"
  94. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  95. xmlns:monolog="http://symfony.com/schema/dic/monolog"
  96. xsi:schemaLocation="http://symfony.com/schema/dic/services
  97. https://symfony.com/schema/dic/services/services-1.0.xsd
  98. http://symfony.com/schema/dic/monolog
  99. https://symfony.com/schema/dic/monolog/monolog-1.0.xsd">
  100. <monolog:config>
  101. <monolog:handler
  102. name="main"
  103. type="stream"
  104. path="%kernel.logs_dir%/%kernel.environment%.log"
  105. level="debug"
  106. formatter="monolog.formatter.session_request"
  107. />
  108. </monolog:config>
  109. </container>
  110. .. code-block:: php
  111. // config/packages/prod/monolog.php
  112. $container->loadFromExtension('monolog', [
  113. 'handlers' => [
  114. 'main' => [
  115. 'type' => 'stream',
  116. 'path' => '%kernel.logs_dir%/%kernel.environment%.log',
  117. 'level' => 'debug',
  118. 'formatter' => 'monolog.formatter.session_request',
  119. ],
  120. ],
  121. ]);
  122. If you use several handlers, you can also register a processor at the
  123. handler level or at the channel level instead of registering it globally
  124. (see the following sections).
  125. Registering Processors per Handler
  126. ----------------------------------
  127. You can register a processor per handler using the ``handler`` option of
  128. the ``monolog.processor`` tag:
  129. .. configuration-block::
  130. .. code-block:: yaml
  131. # config/services.yaml
  132. services:
  133. App\Logger\SessionRequestProcessor:
  134. tags:
  135. - { name: monolog.processor, handler: main }
  136. .. code-block:: xml
  137. <!-- config/services.xml -->
  138. <?xml version="1.0" encoding="UTF-8" ?>
  139. <container xmlns="http://symfony.com/schema/dic/services"
  140. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  141. xmlns:monolog="http://symfony.com/schema/dic/monolog"
  142. xsi:schemaLocation="http://symfony.com/schema/dic/services
  143. https://symfony.com/schema/dic/services/services-1.0.xsd
  144. http://symfony.com/schema/dic/monolog
  145. https://symfony.com/schema/dic/monolog/monolog-1.0.xsd">
  146. <services>
  147. <service id="App\Logger\SessionRequestProcessor">
  148. <tag name="monolog.processor" handler="main"/>
  149. </service>
  150. </services>
  151. </container>
  152. .. code-block:: php
  153. // config/services.php
  154. // ...
  155. $container
  156. ->register(SessionRequestProcessor::class)
  157. ->addTag('monolog.processor', ['handler' => 'main']);
  158. Registering Processors per Channel
  159. ----------------------------------
  160. You can register a processor per channel using the ``channel`` option of
  161. the ``monolog.processor`` tag:
  162. .. configuration-block::
  163. .. code-block:: yaml
  164. # config/services.yaml
  165. services:
  166. App\Logger\SessionRequestProcessor:
  167. tags:
  168. - { name: monolog.processor, channel: main }
  169. .. code-block:: xml
  170. <!-- config/services.xml -->
  171. <?xml version="1.0" encoding="UTF-8" ?>
  172. <container xmlns="http://symfony.com/schema/dic/services"
  173. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  174. xmlns:monolog="http://symfony.com/schema/dic/monolog"
  175. xsi:schemaLocation="http://symfony.com/schema/dic/services
  176. https://symfony.com/schema/dic/services/services-1.0.xsd
  177. http://symfony.com/schema/dic/monolog
  178. https://symfony.com/schema/dic/monolog/monolog-1.0.xsd">
  179. <services>
  180. <service id="App\Logger\SessionRequestProcessor">
  181. <tag name="monolog.processor" channel="main"/>
  182. </service>
  183. </services>
  184. </container>
  185. .. code-block:: php
  186. // config/services.php
  187. // ...
  188. $container
  189. ->register(SessionRequestProcessor::class)
  190. ->addTag('monolog.processor', ['channel' => 'main']);