1: <?php
2: /**
3: * Registry of loaded log engines
4: *
5: * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
6: * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
7: *
8: * Licensed under The MIT License
9: * For full copyright and license information, please see the LICENSE.txt
10: * Redistributions of files must retain the above copyright notice.
11: *
12: * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
13: * @link https://cakephp.org CakePHP(tm) Project
14: * @package Cake.Log
15: * @since CakePHP(tm) v 2.2
16: * @license https://opensource.org/licenses/mit-license.php MIT License
17: */
18:
19: App::uses('ObjectCollection', 'Utility');
20:
21: /**
22: * Registry of loaded log engines
23: *
24: * @package Cake.Log
25: */
26: class LogEngineCollection extends ObjectCollection {
27:
28: /**
29: * Loads/constructs a Log engine.
30: *
31: * @param string $name instance identifier
32: * @param array $options Setting for the Log Engine
33: * @return BaseLog BaseLog engine instance
34: * @throws CakeLogException when logger class does not implement a write method
35: */
36: public function load($name, $options = array()) {
37: $enable = isset($options['enabled']) ? $options['enabled'] : true;
38: $loggerName = $options['engine'];
39: unset($options['engine']);
40: $className = $this->_getLogger($loggerName);
41: $logger = new $className($options);
42: if (!$logger instanceof CakeLogInterface) {
43: throw new CakeLogException(
44: __d('cake_dev', 'logger class %s does not implement a %s method.', $loggerName, 'write()')
45: );
46: }
47: $this->_loaded[$name] = $logger;
48: if ($enable) {
49: $this->enable($name);
50: }
51: return $logger;
52: }
53:
54: /**
55: * Attempts to import a logger class from the various paths it could be on.
56: * Checks that the logger class implements a write method as well.
57: *
58: * @param string $loggerName the plugin.className of the logger class you want to build.
59: * @return mixed boolean false on any failures, string of classname to use if search was successful.
60: * @throws CakeLogException
61: */
62: protected static function _getLogger($loggerName) {
63: list($plugin, $loggerName) = pluginSplit($loggerName, true);
64: if (substr($loggerName, -3) !== 'Log') {
65: $loggerName .= 'Log';
66: }
67: App::uses($loggerName, $plugin . 'Log/Engine');
68: if (!class_exists($loggerName)) {
69: throw new CakeLogException(__d('cake_dev', 'Could not load class %s', $loggerName));
70: }
71: return $loggerName;
72: }
73:
74: }
75: