| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212 |
- <?php
- use DebugBar\DataCollector\MessagesCollector;
- use Psr\Log\LogLevel;
- //use ReflectionClass;
- /**
- * DolLogsCollector class
- */
- class DolLogsCollector extends MessagesCollector
- {
- /**
- * @var string default logs file path
- */
- protected $path;
- /**
- * @var int number of lines to show
- */
- protected $maxnboflines;
- /**
- * @var int number of lines
- */
- protected $nboflines;
- /**
- * Constructor
- *
- * @param string $path Path
- * @param string $name Name
- */
- public function __construct($path = null, $name = 'logs')
- {
- global $conf;
- parent::__construct($name);
- $this->nboflines = 0;
- $this->maxnboflines = getDolGlobalInt('DEBUGBAR_LOGS_LINES_NUMBER', 250); // High number slows seriously output
- $this->path = $path ?: $this->getLogsFile();
- }
- /**
- * Return widget settings
- *
- * @return array Array
- */
- public function getWidgets()
- {
- global $langs;
- $title = $langs->transnoentities('Logs');
- $name = $this->getName();
- return array(
- "$title" => array(
- "icon" => "list-alt",
- "widget" => "PhpDebugBar.Widgets.MessagesWidget",
- "map" => "$name.messages",
- "default" => "[]"
- ),
- "$title:badge" => array(
- "map" => "$name.count",
- "default" => "null"
- )
- );
- }
- /**
- * Return collected data
- *
- * @return array Array
- */
- public function collect()
- {
- global $conf;
- $uselogfile = getDolGlobalInt('DEBUGBAR_USE_LOG_FILE');
- if ($uselogfile) {
- $this->getStorageLogs($this->path);
- } else {
- $log_levels = $this->getLevels();
- foreach ($conf->logbuffer as $line) {
- if ($this->nboflines >= $this->maxnboflines) {
- break;
- }
- foreach ($log_levels as $level_key => $level) {
- if (strpos(strtolower($line), strtolower($level_key)) == 20) {
- $this->nboflines++;
- $this->addMessage($line, $level, false);
- }
- }
- }
- }
- return parent::collect();
- }
- /**
- * Get the path to the logs file
- *
- * @return string
- */
- public function getLogsFile()
- {
- // default dolibarr log file
- $path = DOL_DATA_ROOT.'/dolibarr.log';
- return $path;
- }
- /**
- * Get logs
- *
- * @param string $path Path
- * @return array
- */
- public function getStorageLogs($path)
- {
- if (!file_exists($path)) {
- return;
- }
- // Load the latest lines
- $file = implode("", $this->tailFile($path, $this->maxnboflines));
- foreach ($this->getLogs($file) as $log) {
- $this->addMessage($log['line'], $log['level'], false);
- }
- }
- /**
- * Get latest file lines
- *
- * @param string $file File
- * @param int $lines Lines
- * @return array Array
- */
- protected function tailFile($file, $lines)
- {
- $handle = fopen($file, "r");
- $linecounter = $lines;
- $pos = -2;
- $beginning = false;
- $text = array();
- while ($linecounter > 0) {
- $t = " ";
- while ($t != "\n") {
- if (fseek($handle, $pos, SEEK_END) == -1) {
- $beginning = true;
- break;
- }
- $t = fgetc($handle);
- $pos--;
- }
- $linecounter--;
- if ($beginning) {
- rewind($handle);
- }
- $text[$lines - $linecounter - 1] = fgets($handle);
- if ($beginning) {
- break;
- }
- }
- fclose($handle);
- return array_reverse($text);
- }
- /**
- * Search a string for log entries
- *
- * @param string $file File
- * @return array Lines of logs
- */
- public function getLogs($file)
- {
- $pattern = "/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.*/";
- $log_levels = $this->getLevels();
- preg_match_all($pattern, $file, $matches);
- $log = array();
- foreach ($matches as $lines) {
- foreach ($lines as $line) {
- foreach ($log_levels as $level_key => $level) {
- if (strpos(strtolower($line), strtolower($level_key)) == 20) {
- $log[] = array('level' => $level, 'line' => $line);
- }
- }
- }
- }
- $log = array_reverse($log);
- return $log;
- }
- /**
- * Get the log levels from psr/log.
- *
- * @return array Array of log level
- */
- public function getLevels()
- {
- $class = new ReflectionClass(new LogLevel());
- $levels = $class->getConstants();
- $levels['ERR'] = 'error';
- $levels['WARN'] = 'warning';
- return $levels;
- }
- }
|