vendor/symfony/monolog-bundle/DependencyInjection/MonologExtension.php line 61

Open in your IDE?
  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\DependencyInjection\Definition;
  16. use Symfony\Component\DependencyInjection\Reference;
  17. use Symfony\Component\DependencyInjection\ContainerInterface;
  18. use Elastica\Client;
  19. /**
  20.  * MonologExtension is an extension for the Monolog library.
  21.  *
  22.  * @author Jordi Boggiano <j.boggiano@seld.be>
  23.  * @author Christophe Coevoet <stof@notk.org>
  24.  */
  25. class MonologExtension extends Extension
  26. {
  27.     private $nestedHandlers = array();
  28.     private $swiftMailerHandlers = array();
  29.     private function levelToMonologConst($level)
  30.     {
  31.         return is_int($level) ? $level constant('Monolog\Logger::'.strtoupper($level));
  32.     }
  33.     /**
  34.      * Loads the Monolog configuration.
  35.      *
  36.      * @param array            $configs   An array of configuration settings
  37.      * @param ContainerBuilder $container A ContainerBuilder instance
  38.      */
  39.     public function load(array $configsContainerBuilder $container)
  40.     {
  41.         $configuration $this->getConfiguration($configs$container);
  42.         $config $this->processConfiguration($configuration$configs);
  43.         if (isset($config['handlers'])) {
  44.             $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
  45.             $loader->load('monolog.xml');
  46.             $container->setAlias('logger''monolog.logger');
  47.             $container->setParameter('monolog.use_microseconds'$config['use_microseconds']);
  48.             // always autowire the main logger, require Symfony >= 2.8
  49.             if (method_exists('Symfony\Component\DependencyInjection\Definition''addAutowiringType')) {
  50.                 $container->getDefinition('monolog.logger')->addAutowiringType('Psr\Log\LoggerInterface');
  51.             }
  52.             $handlers = array();
  53.             foreach ($config['handlers'] as $name => $handler) {
  54.                 $handlers[$handler['priority']][] = array(
  55.                     'id' => $this->buildHandler($container$name$handler),
  56.                     'channels' => empty($handler['channels']) ? null $handler['channels'],
  57.                 );
  58.             }
  59.             $container->setParameter(
  60.                 'monolog.swift_mailer.handlers',
  61.                 $this->swiftMailerHandlers
  62.             );
  63.             ksort($handlers);
  64.             $sortedHandlers = array();
  65.             foreach ($handlers as $priorityHandlers) {
  66.                 foreach (array_reverse($priorityHandlers) as $handler) {
  67.                     $sortedHandlers[] = $handler;
  68.                 }
  69.             }
  70.             $handlersToChannels = array();
  71.             foreach ($sortedHandlers as $handler) {
  72.                 if (!in_array($handler['id'], $this->nestedHandlers)) {
  73.                     $handlersToChannels[$handler['id']] = $handler['channels'];
  74.                 }
  75.             }
  76.             $container->setParameter('monolog.handlers_to_channels'$handlersToChannels);
  77.             $this->addClassesToCompile(array(
  78.                 'Monolog\\Formatter\\FormatterInterface',
  79.                 'Monolog\\Formatter\\LineFormatter',
  80.                 'Monolog\\Handler\\HandlerInterface',
  81.                 'Monolog\\Handler\\AbstractHandler',
  82.                 'Monolog\\Handler\\AbstractProcessingHandler',
  83.                 'Monolog\\Handler\\StreamHandler',
  84.                 'Monolog\\Handler\\FingersCrossedHandler',
  85.                 'Monolog\\Handler\\FilterHandler',
  86.                 'Monolog\\Handler\\TestHandler',
  87.                 'Monolog\\Logger',
  88.                 'Symfony\\Bridge\\Monolog\\Logger',
  89.                 'Monolog\\Handler\\FingersCrossed\\ActivationStrategyInterface',
  90.                 'Monolog\\Handler\\FingersCrossed\\ErrorLevelActivationStrategy',
  91.             ));
  92.         }
  93.         $container->setParameter('monolog.additional_channels', isset($config['channels']) ? $config['channels'] : array());
  94.     }
  95.     /**
  96.      * Returns the base path for the XSD files.
  97.      *
  98.      * @return string The XSD base path
  99.      */
  100.     public function getXsdValidationBasePath()
  101.     {
  102.         return __DIR__.'/../Resources/config/schema';
  103.     }
  104.     public function getNamespace()
  105.     {
  106.         return 'http://symfony.com/schema/dic/monolog';
  107.     }
  108.     private function buildHandler(ContainerBuilder $container$name, array $handler)
  109.     {
  110.         $handlerId $this->getHandlerId($name);
  111.         $definition = new Definition(sprintf('%%monolog.handler.%s.class%%'$handler['type']));
  112.         $handler['level'] = $this->levelToMonologConst($handler['level']);
  113.         if ($handler['include_stacktraces']) {
  114.             $definition->setConfigurator(array('Symfony\\Bundle\\MonologBundle\\MonologBundle''includeStacktraces'));
  115.         }
  116.         if ($handler['process_psr_3_messages']) {
  117.             $processorId 'monolog.processor.psr_log_message';
  118.             if (!$container->hasDefinition($processorId)) {
  119.                 $processor = new Definition('Monolog\\Processor\\PsrLogMessageProcessor');
  120.                 $processor->setPublic(false);
  121.                 $container->setDefinition($processorId$processor);
  122.             }
  123.             $definition->addMethodCall('pushProcessor', array(new Reference($processorId)));
  124.         }
  125.         switch ($handler['type']) {
  126.         case 'service':
  127.             $container->setAlias($handlerId$handler['id']);
  128.             return $handlerId;
  129.         case 'stream':
  130.             $definition->setArguments(array(
  131.                 $handler['path'],
  132.                 $handler['level'],
  133.                 $handler['bubble'],
  134.                 $handler['file_permission'],
  135.             ));
  136.             break;
  137.         case 'console':
  138.             if (!class_exists('Symfony\Bridge\Monolog\Handler\ConsoleHandler')) {
  139.                 throw new \RuntimeException('The console handler requires symfony/monolog-bridge 2.4+');
  140.             }
  141.             $definition->setArguments(array(
  142.                 null,
  143.                 $handler['bubble'],
  144.                 isset($handler['verbosity_levels']) ? $handler['verbosity_levels'] : array(),
  145.             ));
  146.             $definition->addTag('kernel.event_subscriber');
  147.             break;
  148.         case 'firephp':
  149.             $definition->setArguments(array(
  150.                 $handler['level'],
  151.                 $handler['bubble'],
  152.             ));
  153.             $definition->addTag('kernel.event_listener', array('event' => 'kernel.response''method' => 'onKernelResponse'));
  154.             break;
  155.         case 'gelf':
  156.             if (isset($handler['publisher']['id'])) {
  157.                 $publisherId $handler['publisher']['id'];
  158.             } elseif (class_exists('Gelf\Transport\UdpTransport')) {
  159.                 $transport = new Definition("Gelf\Transport\UdpTransport", array(
  160.                     $handler['publisher']['hostname'],
  161.                     $handler['publisher']['port'],
  162.                     $handler['publisher']['chunk_size'],
  163.                 ));
  164.                 $transportId uniqid('monolog.gelf.transport.'true);
  165.                 $transport->setPublic(false);
  166.                 $container->setDefinition($transportId$transport);
  167.                 $publisher = new Definition('%monolog.gelfphp.publisher.class%', array());
  168.                 $publisher->addMethodCall('addTransport', array(new Reference($transportId)));
  169.                 $publisherId uniqid('monolog.gelf.publisher.'true);
  170.                 $publisher->setPublic(false);
  171.                 $container->setDefinition($publisherId$publisher);
  172.             } elseif (class_exists('Gelf\MessagePublisher')) {
  173.                 $publisher = new Definition('%monolog.gelf.publisher.class%', array(
  174.                     $handler['publisher']['hostname'],
  175.                     $handler['publisher']['port'],
  176.                     $handler['publisher']['chunk_size'],
  177.                 ));
  178.                 $publisherId uniqid('monolog.gelf.publisher.'true);
  179.                 $publisher->setPublic(false);
  180.                 $container->setDefinition($publisherId$publisher);
  181.             } else {
  182.                 throw new \RuntimeException('The gelf handler requires the graylog2/gelf-php package to be installed');
  183.             }
  184.             $definition->setArguments(array(
  185.                 new Reference($publisherId),
  186.                 $handler['level'],
  187.                 $handler['bubble'],
  188.             ));
  189.             break;
  190.         case 'mongo':
  191.             if (isset($handler['mongo']['id'])) {
  192.                 $clientId $handler['mongo']['id'];
  193.             } else {
  194.                 $server 'mongodb://';
  195.                 if (isset($handler['mongo']['user'])) {
  196.                     $server .= $handler['mongo']['user'].':'.$handler['mongo']['pass'].'@';
  197.                 }
  198.                 $server .= $handler['mongo']['host'].':'.$handler['mongo']['port'];
  199.                 $client = new Definition('%monolog.mongo.client.class%', array(
  200.                     $server,
  201.                 ));
  202.                 $clientId uniqid('monolog.mongo.client.'true);
  203.                 $client->setPublic(false);
  204.                 $container->setDefinition($clientId$client);
  205.             }
  206.             $definition->setArguments(array(
  207.                 new Reference($clientId),
  208.                 $handler['mongo']['database'],
  209.                 $handler['mongo']['collection'],
  210.                 $handler['level'],
  211.                 $handler['bubble'],
  212.             ));
  213.             break;
  214.         case 'elasticsearch':
  215.             if (isset($handler['elasticsearch']['id'])) {
  216.                 $clientId $handler['elasticsearch']['id'];
  217.             } else {
  218.                 // elastica client new definition
  219.                 $elasticaClient = new Definition('%monolog.elastica.client.class%');
  220.                 $elasticaClientArguments = array(
  221.                     'host' => $handler['elasticsearch']['host'],
  222.                     'port' => $handler['elasticsearch']['port'],
  223.                     'transport' => $handler['elasticsearch']['transport'],
  224.                 );
  225.                 if (isset($handler['elasticsearch']['user']) && isset($handler['elasticsearch']['password'])) {
  226.                     $elasticaClientArguments array_merge(
  227.                         $elasticaClientArguments,
  228.                         array(
  229.                             'headers' => array(
  230.                                 'Authorization ' =>  'Basic ' base64_encode($handler['elasticsearch']['user'] . ':' $handler['elasticsearch']['password'])
  231.                             )
  232.                         )
  233.                     );
  234.                 }
  235.                 $elasticaClient->setArguments(array(
  236.                     $elasticaClientArguments
  237.                 ));
  238.                 $clientId uniqid('monolog.elastica.client.'true);
  239.                 $elasticaClient->setPublic(false);
  240.                 $container->setDefinition($clientId$elasticaClient);
  241.             }
  242.             // elastica handler definition
  243.             $definition->setArguments(array(
  244.                 new Reference($clientId),
  245.                 array(
  246.                     'index' => $handler['index'],
  247.                     'type' => $handler['document_type'],
  248.                     'ignore_error' => $handler['ignore_error']
  249.                 ),
  250.                 $handler['level'],
  251.                 $handler['bubble'],
  252.             ));
  253.             break;
  254.         case 'chromephp':
  255.             $definition->setArguments(array(
  256.                 $handler['level'],
  257.                 $handler['bubble'],
  258.             ));
  259.             $definition->addTag('kernel.event_listener', array('event' => 'kernel.response''method' => 'onKernelResponse'));
  260.             break;
  261.         case 'rotating_file':
  262.             $definition->setArguments(array(
  263.                 $handler['path'],
  264.                 $handler['max_files'],
  265.                 $handler['level'],
  266.                 $handler['bubble'],
  267.                 $handler['file_permission'],
  268.             ));
  269.             $definition->addMethodCall('setFilenameFormat', array(
  270.                 $handler['filename_format'],
  271.                 $handler['date_format'],
  272.             ));
  273.             break;
  274.         case 'fingers_crossed':
  275.             $handler['action_level'] = $this->levelToMonologConst($handler['action_level']);
  276.             if (null !== $handler['passthru_level']) {
  277.                 $handler['passthru_level'] = $this->levelToMonologConst($handler['passthru_level']);
  278.             }
  279.             $nestedHandlerId $this->getHandlerId($handler['handler']);
  280.             $this->markNestedHandler($nestedHandlerId);
  281.             if (isset($handler['activation_strategy'])) {
  282.                 $activation = new Reference($handler['activation_strategy']);
  283.             } elseif (!empty($handler['excluded_404s'])) {
  284.                 $activationDef = new Definition('%monolog.activation_strategy.not_found.class%', array($handler['excluded_404s'], $handler['action_level']));
  285.                 $activationDef->addMethodCall('setRequest', array(new Reference('request'ContainerInterface::NULL_ON_INVALID_REFERENCEfalse)));
  286.                 $container->setDefinition($handlerId.'.not_found_strategy'$activationDef);
  287.                 $activation = new Reference($handlerId.'.not_found_strategy');
  288.             } else {
  289.                 $activation $handler['action_level'];
  290.             }
  291.             $definition->setArguments(array(
  292.                 new Reference($nestedHandlerId),
  293.                 $activation,
  294.                 $handler['buffer_size'],
  295.                 $handler['bubble'],
  296.                 $handler['stop_buffering'],
  297.                 $handler['passthru_level'],
  298.             ));
  299.             break;
  300.         case 'filter':
  301.             $handler['min_level'] = $this->levelToMonologConst($handler['min_level']);
  302.             $handler['max_level'] = $this->levelToMonologConst($handler['max_level']);
  303.             foreach (array_keys($handler['accepted_levels']) as $k) {
  304.                 $handler['accepted_levels'][$k] = $this->levelToMonologConst($handler['accepted_levels'][$k]);
  305.             }
  306.             $nestedHandlerId $this->getHandlerId($handler['handler']);
  307.             $this->markNestedHandler($nestedHandlerId);
  308.             $minLevelOrList = !empty($handler['accepted_levels']) ? $handler['accepted_levels'] : $handler['min_level'];
  309.             $definition->setArguments(array(
  310.                 new Reference($nestedHandlerId),
  311.                 $minLevelOrList,
  312.                 $handler['max_level'],
  313.                 $handler['bubble'],
  314.             ));
  315.             break;
  316.         case 'buffer':
  317.             $nestedHandlerId $this->getHandlerId($handler['handler']);
  318.             $this->markNestedHandler($nestedHandlerId);
  319.             $definition->setArguments(array(
  320.                 new Reference($nestedHandlerId),
  321.                 $handler['buffer_size'],
  322.                 $handler['level'],
  323.                 $handler['bubble'],
  324.                 $handler['flush_on_overflow'],
  325.             ));
  326.             break;
  327.         case 'deduplication':
  328.             $nestedHandlerId $this->getHandlerId($handler['handler']);
  329.             $this->markNestedHandler($nestedHandlerId);
  330.             $defaultStore '%kernel.cache_dir%/monolog_dedup_'.sha1($handlerId);
  331.             $definition->setArguments(array(
  332.                 new Reference($nestedHandlerId),
  333.                 isset($handler['store']) ? $handler['store'] : $defaultStore,
  334.                 $handler['deduplication_level'],
  335.                 $handler['time'],
  336.                 $handler['bubble'],
  337.             ));
  338.             break;
  339.         case 'group':
  340.         case 'whatfailuregroup':
  341.             $references = array();
  342.             foreach ($handler['members'] as $nestedHandler) {
  343.                 $nestedHandlerId $this->getHandlerId($nestedHandler);
  344.                 $this->markNestedHandler($nestedHandlerId);
  345.                 $references[] = new Reference($nestedHandlerId);
  346.             }
  347.             $definition->setArguments(array(
  348.                 $references,
  349.                 $handler['bubble'],
  350.             ));
  351.             break;
  352.         case 'syslog':
  353.             $definition->setArguments(array(
  354.                 $handler['ident'],
  355.                 $handler['facility'],
  356.                 $handler['level'],
  357.                 $handler['bubble'],
  358.                 $handler['logopts'],
  359.             ));
  360.             break;
  361.         case 'syslogudp':
  362.             $definition->setArguments(array(
  363.                 $handler['host'],
  364.                 $handler['port'],
  365.                 $handler['facility'],
  366.                 $handler['level'],
  367.                 $handler['bubble'],
  368.             ));
  369.             break;
  370.         case 'swift_mailer':
  371.             $oldHandler false;
  372.             // fallback for older symfony versions that don't have the new SwiftMailerHandler in the bridge
  373.             $newHandlerClass $container->getParameterBag()->resolveValue($definition->getClass());
  374.             if (!class_exists($newHandlerClass)) {
  375.                 $definition = new Definition('Monolog\Handler\SwiftMailerHandler');
  376.                 $oldHandler true;
  377.             }
  378.             if (isset($handler['email_prototype'])) {
  379.                 if (!empty($handler['email_prototype']['method'])) {
  380.                     $prototype = array(new Reference($handler['email_prototype']['id']), $handler['email_prototype']['method']);
  381.                 } else {
  382.                     $prototype = new Reference($handler['email_prototype']['id']);
  383.                 }
  384.             } else {
  385.                 $messageFactory = new Definition('Symfony\Bundle\MonologBundle\SwiftMailer\MessageFactory');
  386.                 $messageFactory->setLazy(true);
  387.                 $messageFactory->setPublic(false);
  388.                 $messageFactory->setArguments(array(
  389.                     new Reference($handler['mailer']),
  390.                     $handler['from_email'],
  391.                     $handler['to_email'],
  392.                     $handler['subject'],
  393.                     $handler['content_type']
  394.                 ));
  395.                 $messageFactoryId sprintf('%s.mail_message_factory'$handlerId);
  396.                 $container->setDefinition($messageFactoryId$messageFactory);
  397.                 // set the prototype as a callable
  398.                 $prototype = array(new Reference($messageFactoryId), 'createMessage');
  399.             }
  400.             $definition->setArguments(array(
  401.                 new Reference($handler['mailer']),
  402.                 $prototype,
  403.                 $handler['level'],
  404.                 $handler['bubble'],
  405.             ));
  406.             if (!$oldHandler) {
  407.                 $this->swiftMailerHandlers[] = $handlerId;
  408.                 $definition->addTag('kernel.event_listener', array('event' => 'kernel.terminate''method' => 'onKernelTerminate'));
  409.                 if (method_exists($newHandlerClass'onCliTerminate')) {
  410.                     $definition->addTag('kernel.event_listener', array('event' => 'console.terminate''method' => 'onCliTerminate'));
  411.                 }
  412.             }
  413.             break;
  414.         case 'native_mailer':
  415.             $definition->setArguments(array(
  416.                 $handler['to_email'],
  417.                 $handler['subject'],
  418.                 $handler['from_email'],
  419.                 $handler['level'],
  420.                 $handler['bubble'],
  421.             ));
  422.             break;
  423.         case 'socket':
  424.             $definition->setArguments(array(
  425.                 $handler['connection_string'],
  426.                 $handler['level'],
  427.                 $handler['bubble'],
  428.             ));
  429.             if (isset($handler['timeout'])) {
  430.                 $definition->addMethodCall('setTimeout', array($handler['timeout']));
  431.             }
  432.             if (isset($handler['connection_timeout'])) {
  433.                 $definition->addMethodCall('setConnectionTimeout', array($handler['connection_timeout']));
  434.             }
  435.             if (isset($handler['persistent'])) {
  436.                 $definition->addMethodCall('setPersistent', array($handler['persistent']));
  437.             }
  438.             break;
  439.         case 'pushover':
  440.             $definition->setArguments(array(
  441.                 $handler['token'],
  442.                 $handler['user'],
  443.                 $handler['title'],
  444.                 $handler['level'],
  445.                 $handler['bubble'],
  446.             ));
  447.             break;
  448.         case 'hipchat':
  449.             $definition->setArguments(array(
  450.                 $handler['token'],
  451.                 $handler['room'],
  452.                 $handler['nickname'],
  453.                 $handler['notify'],
  454.                 $handler['level'],
  455.                 $handler['bubble'],
  456.                 $handler['use_ssl'],
  457.                 $handler['message_format'],
  458.                 !empty($handler['host']) ? $handler['host'] : 'api.hipchat.com',
  459.                 !empty($handler['api_version']) ? $handler['api_version'] : 'v1',
  460.             ));
  461.             break;
  462.         case 'slack':
  463.             $definition->setArguments(array(
  464.                 $handler['token'],
  465.                 $handler['channel'],
  466.                 $handler['bot_name'],
  467.                 $handler['use_attachment'],
  468.                 $handler['icon_emoji'],
  469.                 $handler['level'],
  470.                 $handler['bubble'],
  471.                 $handler['use_short_attachment'],
  472.                 $handler['include_extra'],
  473.             ));
  474.             break;
  475.         case 'cube':
  476.             $definition->setArguments(array(
  477.                 $handler['url'],
  478.                 $handler['level'],
  479.                 $handler['bubble'],
  480.             ));
  481.             break;
  482.         case 'amqp':
  483.             $definition->setArguments(array(
  484.                 new Reference($handler['exchange']),
  485.                 $handler['exchange_name'],
  486.                 $handler['level'],
  487.                 $handler['bubble'],
  488.             ));
  489.             break;
  490.         case 'error_log':
  491.             $definition->setArguments(array(
  492.                 $handler['message_type'],
  493.                 $handler['level'],
  494.                 $handler['bubble'],
  495.             ));
  496.             break;
  497.         case 'raven':
  498.             if (null !== $handler['client_id']) {
  499.                 $clientId $handler['client_id'];
  500.             } else {
  501.                 $client = new Definition('Raven_Client', array(
  502.                     $handler['dsn'],
  503.                     array('auto_log_stacks' => $handler['auto_log_stacks'])
  504.                 ));
  505.                 $client->setPublic(false);
  506.                 $clientId 'monolog.raven.client.'.sha1($handler['dsn']);
  507.                 $container->setDefinition($clientId$client);
  508.             }
  509.             $definition->setArguments(array(
  510.                 new Reference($clientId),
  511.                 $handler['level'],
  512.                 $handler['bubble'],
  513.             ));
  514.             if (!empty($handler['release'])) {
  515.                 $definition->addMethodCall('setRelease', array($handler['release']));
  516.             }
  517.             break;
  518.         case 'loggly':
  519.             $definition->setArguments(array(
  520.                 $handler['token'],
  521.                 $handler['level'],
  522.                 $handler['bubble'],
  523.             ));
  524.             if (!empty($handler['tags'])) {
  525.                 $definition->addMethodCall('setTag', array(implode(','$handler['tags'])));
  526.             }
  527.             break;
  528.         case 'logentries':
  529.             $definition->setArguments(array(
  530.                 $handler['token'],
  531.                 $handler['use_ssl'],
  532.                 $handler['level'],
  533.                 $handler['bubble'],
  534.             ));
  535.             if (isset($handler['timeout'])) {
  536.                 $definition->addMethodCall('setTimeout', array($handler['timeout']));
  537.             }
  538.             if (isset($handler['connection_timeout'])) {
  539.                 $definition->addMethodCall('setConnectionTimeout', array($handler['connection_timeout']));
  540.             }
  541.             break;
  542.         case 'flowdock':
  543.             $definition->setArguments(array(
  544.                 $handler['token'],
  545.                 $handler['level'],
  546.                 $handler['bubble'],
  547.             ));
  548.             if (empty($handler['formatter'])) {
  549.                 $formatter = new Definition("Monolog\Formatter\FlowdockFormatter", array(
  550.                     $handler['source'],
  551.                     $handler['from_email'],
  552.                 ));
  553.                 $formatterId 'monolog.flowdock.formatter.'.sha1($handler['source'].'|'.$handler['from_email']);
  554.                 $formatter->setPublic(false);
  555.                 $container->setDefinition($formatterId$formatter);
  556.                 $definition->addMethodCall('setFormatter', array(new Reference($formatterId)));
  557.             }
  558.             break;
  559.         case 'rollbar':
  560.             if (!empty($handler['id'])) {
  561.                 $rollbarId $handler['id'];
  562.             } else {
  563.                 $config $handler['config'] ?: array();
  564.                 $config['access_token'] = $handler['token'];
  565.                 $rollbar = new Definition('RollbarNotifier', array(
  566.                     $config,
  567.                 ));
  568.                 $rollbarId 'monolog.rollbar.notifier.'.sha1(json_encode($config));
  569.                 $rollbar->setPublic(false);
  570.                 $container->setDefinition($rollbarId$rollbar);
  571.             }
  572.             $definition->setArguments(array(
  573.                 new Reference($rollbarId),
  574.                 $handler['level'],
  575.                 $handler['bubble'],
  576.             ));
  577.             break;
  578.         case 'newrelic':
  579.             $definition->setArguments(array(
  580.                 $handler['level'],
  581.                 $handler['bubble'],
  582.                 $handler['app_name'],
  583.             ));
  584.             break;
  585.         // Handlers using the constructor of AbstractHandler without adding their own arguments
  586.         case 'browser_console':
  587.         case 'test':
  588.         case 'null':
  589.         case 'debug':
  590.             $definition->setArguments(array(
  591.                 $handler['level'],
  592.                 $handler['bubble'],
  593.             ));
  594.             break;
  595.         default:
  596.             throw new \InvalidArgumentException(sprintf('Invalid handler type "%s" given for handler "%s"'$handler['type'], $name));
  597.         }
  598.         if (!empty($handler['nested']) && true === $handler['nested']) {
  599.             $this->markNestedHandler($handlerId);
  600.         }
  601.         if (!empty($handler['formatter'])) {
  602.             $definition->addMethodCall('setFormatter', array(new Reference($handler['formatter'])));
  603.         }
  604.         $container->setDefinition($handlerId$definition);
  605.         return $handlerId;
  606.     }
  607.     private function markNestedHandler($nestedHandlerId)
  608.     {
  609.         if (in_array($nestedHandlerId$this->nestedHandlers)) {
  610.             return;
  611.         }
  612.         $this->nestedHandlers[] = $nestedHandlerId;
  613.     }
  614.     private function getHandlerId($name)
  615.     {
  616.         return sprintf('monolog.handler.%s'$name);
  617.     }
  618. }