MonologExtension.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Symfony\Bundle\MonologBundle\DependencyInjection;
  11. use Symfony\Component\HttpKernel\DependencyInjection\Extension;
  12. use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
  13. use Symfony\Component\DependencyInjection\ContainerBuilder;
  14. use Symfony\Component\Config\FileLocator;
  15. use Symfony\Component\Config\Definition\Processor;
  16. use Symfony\Component\DependencyInjection\Definition;
  17. use Symfony\Component\DependencyInjection\Reference;
  18. use Symfony\Component\DependencyInjection\Parameter;
  19. /**
  20. * MonologExtension is an extension for the Monolog library.
  21. *
  22. * @author Jordi Boggiano <j.boggiano@seld.be>
  23. */
  24. class MonologExtension extends Extension
  25. {
  26. /**
  27. * Loads the Monolog configuration.
  28. *
  29. * Usage example:
  30. *
  31. * monolog:
  32. * handlers:
  33. * myhandler:
  34. * level: info
  35. * path: path/to/some.log
  36. *
  37. * @param array $config An array of configuration settings
  38. * @param ContainerBuilder $container A ContainerBuilder instance
  39. */
  40. public function load(array $configs, ContainerBuilder $container)
  41. {
  42. $configuration = new Configuration();
  43. $processor = new Processor();
  44. $config = $processor->process($configuration->getConfigTree(), $configs);
  45. if (isset($config['handlers'])) {
  46. $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
  47. $loader->load('monolog.xml');
  48. $container->setAlias('logger', 'monolog.logger');
  49. $logger = $container->getDefinition('monolog.logger_prototype');
  50. $handlers = array();
  51. foreach ($config['handlers'] as $name => $handler) {
  52. $handlers[] = $this->buildHandler($container, $name, $handler);
  53. }
  54. // TODO somehow the DebugLogger should be pushed on the stack as well, or that concept needs to be changed
  55. // didn't have to investigate yet what it is exactly
  56. $handlers = array_reverse($handlers);
  57. foreach ($handlers as $handler) {
  58. $logger->addMethodCall('pushHandler', array(new Reference($handler)));
  59. }
  60. }
  61. }
  62. public function buildHandler(ContainerBuilder $container, $name, array $handler)
  63. {
  64. $handlerId = sprintf('monolog.handler.%s', $name);
  65. $definition = new Definition(sprintf('%%monolog.handler.%s.class%%', $handler['type']));
  66. $handler['level'] = is_int($handler['level']) ? $handler['level'] : constant('Monolog\Logger::'.strtoupper($handler['level']));
  67. switch ($handler['type']) {
  68. case 'stream':
  69. if (!isset($handler['path'])) {
  70. $handler['path'] = '%kernel.logs_dir%/%kernel.environment%.log';
  71. }
  72. $definition->setArguments(array(
  73. $handler['path'],
  74. $handler['level'],
  75. $handler['bubble'],
  76. ));
  77. break;
  78. case 'fingerscrossed':
  79. if (!isset($handler['action_level'])) {
  80. $handler['action_level'] = 'WARNING';
  81. }
  82. $handler['action_level'] = is_int($handler['action_level']) ? $handler['action_level'] : constant('Monolog\Logger::'.strtoupper($handler['action_level']));
  83. $definition->setArguments(array(
  84. $this->buildHandler($container, $handler['handler']),
  85. $handler['action_level'],
  86. isset($handler['buffer_size']) ? $handler['buffer_size'] : 0,
  87. $handler['bubble'],
  88. ));
  89. break;
  90. default:
  91. // Handler using the constructor of AbstractHandler without adding their own arguments
  92. $definition->setArguments(array(
  93. $handler['level'],
  94. $handler['bubble'],
  95. ));
  96. break;
  97. }
  98. $container->setDefinition($handlerId, $definition);
  99. return $handlerId;
  100. }
  101. /**
  102. * Returns the base path for the XSD files.
  103. *
  104. * @return string The XSD base path
  105. */
  106. public function getXsdValidationBasePath()
  107. {
  108. return __DIR__.'/../Resources/config/schema';
  109. }
  110. public function getNamespace()
  111. {
  112. return 'http://www.symfony-project.org/schema/dic/monolog';
  113. }
  114. }