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