4 * Description: A Logging framework with lots of additions (see [Monolog](https://github.com/Seldaek/monolog/)). There are just Friendica additions inside the src directory
6 * Author: Philipp Holzer
10 use Friendica\Core\Hook;
11 use Friendica\Addon\Monolog\IntrospectionProcessor;
15 require_once __DIR__ . '/vendor/autoload.php';
17 function monolog_install(App $a)
19 Hook::register('logger_instance' , __FILE__, 'monolog_instance');
22 function monolog_uninstall()
24 Hook::unregister('logger_instance', __FILE__, 'monolog_instance');
27 function monolog_instance(App $a, array &$data)
29 if ($data['name'] !== 'monolog') {
33 $loggerTimeZone = new \DateTimeZone('UTC');
35 $logger = new Monolog\Logger($data['channel']);
36 $logger->setTimezone($loggerTimeZone);
37 $logger->pushProcessor(new Monolog\Processor\PsrLogMessageProcessor());
38 $logger->pushProcessor(new Monolog\Processor\ProcessIdProcessor());
39 $logger->pushProcessor(new Monolog\Processor\UidProcessor());
40 $logger->pushProcessor(new IntrospectionProcessor($data['introspection'], LogLevel::DEBUG));
42 $stream = DI::config()->get('system', 'logfile');
44 // just add a stream in case it's either writable or not file
45 if (!is_file($stream) || is_writable($stream)) {
47 $loglevel = Monolog\Logger::toMonologLevel($data['loglevel']);
49 // fallback to notice if an invalid loglevel is set
50 if (!is_int($loglevel)) {
51 $loglevel = LogLevel::NOTICE;
54 $fileHandler = new Monolog\Handler\StreamHandler($stream, $loglevel);
56 $formatter = new Monolog\Formatter\LineFormatter("%datetime% %channel% [%level_name%]: %message% %context% %extra%\n");
57 $fileHandler->setFormatter($formatter);
59 $logger->pushHandler($fileHandler);
60 } catch (\Throwable $e) {
65 $data['storage'] = $logger;