1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
19: namespace Fluent\Logger;
20:
21: 22: 23: 24: 25: 26:
27: class ChainLogger extends BaseLogger
28: {
29: protected $chain = array();
30: protected $errors = array();
31:
32: public function __construct()
33: {
34: }
35:
36: public function addLogger(\Fluent\Logger\BaseLogger $logger)
37: {
38: $logger->registerErrorHandler(array($this,"defaultErrorHandler"));
39:
40: $this->chain[] = $logger;
41: }
42:
43: public function defaultErrorHandler(BaseLogger $logger, Entity $entity, $error)
44: {
45: error_log(sprintf("ChainLogger: %s %s %s: %s", get_class($logger), $error, $entity->getTag(), json_encode($entity->getData())));
46: }
47:
48: 49: 50: 51: 52: 53:
54: public function post($tag, array $data)
55: {
56: $result = false;
57: $entity = new Entity($tag, $data);
58:
59: if (!count($this->getAvailableLoggers())) {
60: throw new \Exception("ChainLogger have to call addLogger before post method. or all logger failed...");
61: }
62:
63: foreach ($this->getAvailableLoggers() as $offset => $logger) {
64:
65: $result = $logger->post2($entity);
66:
67: if ($result) {
68: break;
69: } else {
70:
71: $this->errors[$offset] = true;
72: }
73: }
74:
75: return $result;
76: }
77:
78: 79: 80: 81: 82:
83: public function getAvailableLoggers()
84: {
85: $result = array();
86: foreach ($this->chain as $offset => $logger) {
87:
88:
89: if (!isset($this->errors[$offset])) {
90: $result[] = $logger;
91: } else {
92: continue;
93: }
94: }
95:
96: return $result;
97: }
98:
99: public function post2(Entity $entity)
100: {
101: throw new \Exception("ChainLogger does not support post2 method");
102: }
103:
104:
105: }