Merge pull request #6638 from Ixiter/develop-markdown-anchors
[friendica.git/.git] / src / Factory / LoggerFactory.php
1 <?php
2
3 namespace Friendica\Factory;
4
5 use Friendica\Core\Config\ConfigCache;
6 use Friendica\Network\HTTPException\InternalServerErrorException;
7 use Friendica\Util\Logger\FriendicaDevelopHandler;
8 use Friendica\Util\Logger\FriendicaIntrospectionProcessor;
9 use Monolog;
10 use Psr\Log\LoggerInterface;
11 use Psr\Log\LogLevel;
12
13 /**
14  * A logger factory
15  *
16  * Currently only Monolog is supported
17  */
18 class LoggerFactory
19 {
20         /**
21          * Creates a new PSR-3 compliant logger instances
22          *
23          * @param string      $channel The channel of the logger instance
24          * @param ConfigCache $config  The config
25          *
26          * @return LoggerInterface The PSR-3 compliant logger instance
27          */
28         public static function create($channel, ConfigCache $config = null)
29         {
30                 $logger = new Monolog\Logger($channel);
31                 $logger->pushProcessor(new Monolog\Processor\PsrLogMessageProcessor());
32                 $logger->pushProcessor(new Monolog\Processor\ProcessIdProcessor());
33                 $logger->pushProcessor(new Monolog\Processor\UidProcessor());
34                 $logger->pushProcessor(new FriendicaIntrospectionProcessor(LogLevel::DEBUG, ['Friendica\\Core\\Logger']));
35
36                 if (isset($config)) {
37                         $debugging = $config->get('system', 'debugging');
38                         $stream = $config->get('system', 'logfile');
39                         $level = $config->get('system', 'loglevel');
40
41                         if ($debugging) {
42                                 static::addStreamHandler($logger, $stream, $level);
43                         }
44                 }
45
46                 return $logger;
47         }
48
49         /**
50          * Creates a new PSR-3 compliant develop logger
51          *
52          * If you want to debug only interactions from your IP or the IP of a remote server for federation debug,
53          * you'll use this logger instance for the duration of your work.
54          *
55          * It should never get filled during normal usage of Friendica
56          *
57          * @param string $channel      The channel of the logger instance
58          * @param string $developerIp  The IP of the developer who wants to use the logger
59          *
60          * @return LoggerInterface The PSR-3 compliant logger instance
61          */
62         public static function createDev($channel, $developerIp)
63         {
64                 $logger = new Monolog\Logger($channel);
65                 $logger->pushProcessor(new Monolog\Processor\PsrLogMessageProcessor());
66                 $logger->pushProcessor(new Monolog\Processor\ProcessIdProcessor());
67                 $logger->pushProcessor(new Monolog\Processor\UidProcessor());
68                 $logger->pushProcessor(new FriendicaIntrospectionProcessor(LogLevel::DEBUG, ['Friendica\\Core\\Logger']));
69
70
71                 $logger->pushHandler(new FriendicaDevelopHandler($developerIp));
72
73                 return $logger;
74         }
75
76         /**
77          * Adding a handler to a given logger instance
78          *
79          * @param LoggerInterface $logger  The logger instance
80          * @param mixed           $stream  The stream which handles the logger output
81          * @param string          $level   The level, for which this handler at least should handle logging
82          *
83          * @return void
84          *
85          * @throws InternalServerErrorException if the logger is incompatible to the logger factory
86          * @throws \Exception in case of general failures
87          */
88         public static function addStreamHandler($logger, $stream, $level = LogLevel::NOTICE)
89         {
90                 if ($logger instanceof Monolog\Logger) {
91                         $loglevel = Monolog\Logger::toMonologLevel($level);
92
93                         // fallback to notice if an invalid loglevel is set
94                         if (!is_int($loglevel)) {
95                                 $loglevel = LogLevel::NOTICE;
96                         }
97                         $fileHandler = new Monolog\Handler\StreamHandler($stream, $loglevel);
98
99                         $formatter = new Monolog\Formatter\LineFormatter("%datetime% %channel% [%level_name%]: %message% %context% %extra%\n");
100                         $fileHandler->setFormatter($formatter);
101
102                         $logger->pushHandler($fileHandler);
103                 } else {
104                         throw new InternalServerErrorException('Logger instance incompatible for MonologFactory');
105                 }
106         }
107
108         /**
109          * This method enables the test mode of a given logger
110          *
111          * @param LoggerInterface $logger The logger
112          *
113          * @return Monolog\Handler\TestHandler the Handling for tests
114          *
115          * @throws InternalServerErrorException if the logger is incompatible to the logger factory
116          */
117         public static function enableTest($logger)
118         {
119                 if ($logger instanceof Monolog\Logger) {
120                         // disable every handler so far
121                         $logger->pushHandler(new Monolog\Handler\NullHandler());
122
123                         // enable the test handler
124                         $fileHandler = new Monolog\Handler\TestHandler();
125                         $formatter = new Monolog\Formatter\LineFormatter("%datetime% %channel% [%level_name%]: %message% %context% %extra%\n");
126                         $fileHandler->setFormatter($formatter);
127
128                         $logger->pushHandler($fileHandler);
129
130                         return $fileHandler;
131                 } else {
132                         throw new InternalServerErrorException('Logger instance incompatible for MonologFactory');
133                 }
134         }
135 }