xref: /dokuwiki/inc/Logger.php (revision 0ecde6ce23ad8ee6132797de11e004e7458a83fd)
1<?php
2
3namespace dokuwiki;
4
5class Logger
6{
7    const LOG_ERROR = 'error';
8    const LOG_DEPRECATED = 'deprecated';
9    const LOG_DEBUG = 'debug';
10
11    /** @var Logger[] */
12    static protected $instances;
13
14    /** @var string what kind of log is this */
15    protected $facility;
16
17    /**
18     * Logger constructor.
19     *
20     * @param string $facility The type of log
21     */
22    protected function __construct($facility)
23    {
24        $this->facility = $facility;
25    }
26
27    /**
28     * Return a Logger instance for the given facility
29     *
30     * @param string $facility The type of log
31     * @return Logger
32     */
33    static public function getInstance($facility = self::LOG_ERROR)
34    {
35        if (self::$instances[$facility] === null) {
36            self::$instances[$facility] = new Logger($facility);
37        }
38        return self::$instances[$facility];
39    }
40
41    /**
42     * Log a message to the facility log
43     *
44     * @param string $message The log message
45     * @param mixed $details Any details that should be added to the log entry
46     * @param string $file A source filename if this is related to a source position
47     * @param int $line A line number for the above file
48     * @return bool
49     */
50    public function log($message, $details = null, $file = '', $line = 0)
51    {
52        // details are logged indented
53        if ($details && !is_string($details)) {
54            $details = json_encode($details, JSON_PRETTY_PRINT);
55            $details = explode("\n", $details);
56            $loglines = array_map(function ($line) {
57                return '  ' . $line;
58            }, $details);
59        } elseif ($details) {
60            $loglines = [$details];
61        } else {
62            $loglines = [];
63        }
64
65        $logline = gmdate('c') . "\t" . $message;
66        if ($file) {
67            $logline .= "\t$file";
68            if ($line) $logline .= "($line)";
69        }
70
71        array_unshift($loglines, $logline);
72        return $this->writeLogLines($loglines);
73    }
74
75    /**
76     * Write the given lines to today's facility log
77     *
78     * @param string[] $lines the raw lines to append to the log
79     * @return bool true if the log was written
80     */
81    protected function writeLogLines($lines)
82    {
83        global $conf;
84        $logfile = $conf['logdir'] . '/' . $this->facility . '/' . gmdate('Y-m-d') . '.log';
85        return io_saveFile($logfile, join("\n", $lines) . "\n", true);
86    }
87}
88